[英]How do I select multiple columns and expand properties using powershell select-string -Allmatch?
我正在搜索文本文件(* .sql)的集合,查找是否出現以9開頭的8位數字。文件中可能存在這些數字的多個實例,並且文件的每一行上可能有多個實例。 我只希望輸出顯示每個文件中每個8位數字的唯一出現。 這是我到目前為止的內容:
Select-String "9[0-9]{8}" "*.sql" -AllMatches | Select-Object FileName, @{N="Value";E={ $_.matches | %{$_.groups[0].value}}} | Select-Object -unique FileName,Value
我的輸出如下所示:
FileName Value
-------- -----
File1.sql 907520714
File1.sql {907500507, 907520700, 907520701, 907520703...}
File1.sql {907520725, 907520727, 907520728, 907520729}
File1.sql 990140600
File2.sql 990319161
File2.sql {990603919, 990603925, 990603926}
File2.sql {991100103, 991100103}
File2.sql {990700023, 990700504, 990700521, 990740520...}
File3.sql 907500044
等等....
我想做的是擴展數組,以便當我通過select -unique傳遞它時,實際上我只會得到每個文件中包含的唯一8位數字。
這就是我想要的:
FileName Value
-------- -----
File1.sql 907520714
File1.sql 907500507
File1.sql 907520700
File1.sql 907520701
File1.sql 907520703
File1.sql 907520725
File1.sql 907520727
File1.sql 907520728
File1.sql 907520729
File1.sql 990140600
File2.sql 990319161
File2.sql 990603919
File2.sql 990603925
File2.sql 990603926
File2.sql 991100103
File2.sql 990700023
File2.sql 990700504
File2.sql 990700521
File2.sql 990740520
File3.sql 907500044
等等...
我怎樣才能做到這一點? 我當前的powershell命令可以改進嗎?
謝謝!
好吧,主要是跑掉您擁有的東西。 我正在對選擇字符串找到的所有匹配項進行ForEach循環,然后按文件名將它們分組。 然后,對於每個文件,我遍歷展開“匹配”的組,然后僅對匹配的文本取唯一值。 對於每個值,我輸出一個包含文件名和匹配值的對象。
ForEach($File in Select-String "9[0-9]{8}" "*.sql" -AllMatches | Group FileName){
$File.group|select -expand matches|Select Value -Unique|%{
new-object PSObject -property @{
FileName=$File.Name
Match=$_.value
}
}
}
我對命令進行了一些重新格式化,我認為PowerShell速記的簡潔性質使其更難發現問題。
Select-String "9[0-9]{8}" "*.sql" -AllMatches | `
Select-Object FileName, @{N="Value";E={ $_.matches | %{$_.groups[0].value}}} | `
Select-Object -unique FileName,Value
您的原始命令為Select-String返回的每個MatchInfo產生一條輸出行。 MatchInfo表示文本文件的匹配行。 我相信當文件中的一行包含多個匹配值時,您將獲得一組值。
我對其進行了修訂,以闡明我們希望為每個MatchInfo中的每個RegexMatch提供一個輸出對象,也就是說,為每個匹配值提供一個輸出對象。
Select-String "9[0-9]{8}" "*.sql" -AllMatches | `
Foreach-Object {
# $_ is MatchInfo for each matching line in file
$fileName = $_.FileName
$_.Matches | Foreach-Object {
# $_ is RegexMatch for each match in line
$_ | Select-Object -Property @{N="FileName";E={$fileName} },Value
}
} | Select-Object -unique FileName,Value
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.