在 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 以获得基于 0array 索引,以及使用.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