我需要在文件中搜索单个字符(足够容易),但是希望将它们放在表列中,并在相关列中包含行号和索引(行位置)。
我尝试在已定义的数组内外运行查询,但是for循环不断创建似乎是嵌套数组的数组。我发现自己位于PowerShell foo的末尾。
$obj = @()
$obj += @{
line = gc .\occurences.txt | select-string -Pattern 'r','a','r','e' -AllMatches | Select-Object LineNumber
index = gc .\occurences.txt | select-string -Pattern 'r','a','r','e' -AllMatches | % { $_.Matches } | Select-Object Index
value = gc .\occurences.txt | select-string -Pattern 'r','a','r','e' -AllMatches | % { $_.Matches } | % { $_.Value }
}
$obj | format-list
当前输出为:
Name : index
Value : {@{Index=66}, @{Index=20}}
Name : value
Value : {e, r}
Name : line
Value : {@{LineNumber=775}, @{LineNumber=925}}
But I would prefer something like:
Value LineNumber Index
e 775 66
r 925 20
答案 0 :(得分:0)
这是完成此任务的一种方法:
$charMatches = Select-String -Path '.\occurences.txt' -Pattern 'r','a','r','e' -AllMatches
$charMatches | Foreach-Object {
$line = $_.Linenumber
$_.Matches | Select-Object @{ n='Value'; e={ $_.Value }}
@{ n='Linenumber'; e={ $line }}
@{ n='Index'; e={ $_.Index }}
}
说明:
$charMatches
存储一个MatchInfo对象数组。从这些对象中,您可以访问.LineNumber
和.Matches
属性。 .Matches
属性返回一个Match对象,该对象包含其他属性,例如.Value
和.Index
。
第一个Foreach-Object
处理每个MatchInfo对象,这就是我们能够为属于该对象的所有匹配项在.LineNumber
中存储$line
的方式。
由于.Matches
包含一个数组,我们将选择Select-Object
命令处理要处理的每个数组元素,选择我们要输出的属性(索引和值)。
这里不需要Get-Content
,因为您可以将文件传递到Select-String -Path
。
答案 1 :(得分:0)
谢谢AdminOfThings,您的回复使我非常接近,但是我仍然无法正确列出索引。一旦意识到可以双重方法,嵌套的forloop问题就解决了。完成下面的答案,再次感谢您!
$hit = Select-String -Path $file -Pattern 'r','e' -AllMatches | Foreach-Object{
New-Object -TypeName PSObject -Property @{
LineNumber = $_.LineNumber
Pattern = $_.Pattern
Line = $_.Line
Index = $_.matches.Index
FileName = $_.Path
}
}
$hit | Format-Table -Wrap -Property Pattern,LineNumber,Index -AutoSize
Pattern LineNumber Index
------- ---------- -----
e 775 66
r 925 20