在 PowerShell 中,有一种方法可以 return 具有字符串子字符串的数组索引
In PowerShell is there a way to return the index of an array with substring of a string
除了老式循环索引之外,还有另一种方法return数组中子字符串的每个实例的索引吗?
$myarray = @('herp','dederp','dedoo','flerp')
$substring = 'erp'
$indices = @()
for ($i=0; $i -lt $myarray.length; $i++) {
if ($myarray[$i] -match $substring){
$indices = $indices + $i
}
}
$thisiswrong = @($myarray.IndexOf($substring))
这种 for 循环中的条件有点麻烦,$thisiswrong
只能得到 [-1]
的值
您可以使用 LINQ(改编自 this C# answer):
$myarray = 'herp', 'dederp', 'dedoo', 'flerp'
$substring = 'erp'
[int[]] $indices = [Linq.Enumerable]::Range(0, $myarray.Count).
Where({ param($i) $myarray[$i] -match $substring })
$indices
收到 0, 1, 3
.
至于你试过的:
$thisiswrong = @($myarray.IndexOf($substring))
System.Array.IndexOf
只会找到 one 索引并匹配 entire 元素,在字符串的情况下按字面和区分大小写.
有一个 更像 PowerShell,但速度要慢得多的替代方案,正如 ; you can take advantage of the fact that the match-information objects that Select-String
所暗示的那样,输出具有 .LineNumber
属性,反映输入集合中基于 1
的位置索引 - 即使输入不是来自文件:
$myarray = 'herp', 'dederp', 'dedoo', 'flerp'
$substring = 'erp'
[int[]] $indices =
($myarray | Select-String $substring).ForEach({ $_.LineNumber - 1 })
注意需要从每个 .LineNumber
值中减去 1
以获得基于 0
的 array 索引,以及使用.ForEach()
array method, which performs better than the ForEach-Object
cmdlet.
如果是文件...
get-content file | select-string erp | select line, linenumber
Line LineNumber
---- ----------
herp 1
dederp 2
flerp 4
除了老式循环索引之外,还有另一种方法return数组中子字符串的每个实例的索引吗?
$myarray = @('herp','dederp','dedoo','flerp')
$substring = 'erp'
$indices = @()
for ($i=0; $i -lt $myarray.length; $i++) {
if ($myarray[$i] -match $substring){
$indices = $indices + $i
}
}
$thisiswrong = @($myarray.IndexOf($substring))
这种 for 循环中的条件有点麻烦,$thisiswrong
只能得到 [-1]
您可以使用 LINQ(改编自 this C# answer):
$myarray = 'herp', 'dederp', 'dedoo', 'flerp'
$substring = 'erp'
[int[]] $indices = [Linq.Enumerable]::Range(0, $myarray.Count).
Where({ param($i) $myarray[$i] -match $substring })
$indices
收到 0, 1, 3
.
至于你试过的:
$thisiswrong = @($myarray.IndexOf($substring))
System.Array.IndexOf
只会找到 one 索引并匹配 entire 元素,在字符串的情况下按字面和区分大小写.
有一个 更像 PowerShell,但速度要慢得多的替代方案,正如 Select-String
所暗示的那样,输出具有 .LineNumber
属性,反映输入集合中基于 1
的位置索引 - 即使输入不是来自文件:
$myarray = 'herp', 'dederp', 'dedoo', 'flerp'
$substring = 'erp'
[int[]] $indices =
($myarray | Select-String $substring).ForEach({ $_.LineNumber - 1 })
注意需要从每个 .LineNumber
值中减去 1
以获得基于 0
的 array 索引,以及使用.ForEach()
array method, which performs better than the ForEach-Object
cmdlet.
如果是文件...
get-content file | select-string erp | select line, linenumber
Line LineNumber
---- ----------
herp 1
dederp 2
flerp 4