我正在使用PowerShell命令在目录中查找所有* .vue文件(它是一种简单的文本格式),我需要在其中匹配:
7,Id 6,Default
所以,这些是连续2行。使用Notepad ++,我在行尾看到了CRLF。谷歌搜索后,必须关闭:
Get-ChildItem "D:\Wim\TM1\TI processes" -Filter *.vue -Recurse |
Select-String -Pattern "7,Id\r\n6,Default" -CaseSensitive |
Out-File C:\test.txt
但它找不到文件。我检查过我可以正确找到第一部分(7,Id
),还有第二部分(6,Default
),但与换行符的组合无效。
有什么想法吗?也许是另类?
我可以有一个解决方法,但效率低,编码很多。例如,我可以使用PowerShell提供仅第一个句子的列表,然后处理这些文件以查看它是否与第二个句子匹配。我想避免这种情况。
答案 0 :(得分:1)
您需要将文件的内容作为单个字符串传递,否则Select-String
将分别将模式应用于每一行。
Get-ChildItem "D:\Wim\TM1\TI processes" -Filter *.vue -Recurse | ForEach-Object {
Get-Content $_.FullName | Out-String |
Select-String -Pattern "7,Id\r\n6,Default" -CaseSensitive |
Select-Object -Expand Matches |
Select-Object -Expand Groups |
Select-Object -Expand Value
} | Out-File C:\test.txt
在PowerShell v3及更新版本上,您可以使用Get-Content -Raw
代替Get-Content | Out-String
。
作为Select-String
的替代方案,您可以在-cmatch
过滤器中使用Where-Object
运算符:
Get-ChildItem "D:\Wim\TM1\TI processes" -Filter *.vue -Recurse | ForEach-Object {
Get-Content $_.FullName | Out-String | Where-Object {
$_ -cmatch "7,Id\r\n6,Default"
} | ForEach-Object {
$matches[0]
}
} | Out-File C:\test.txt
答案 1 :(得分:0)
使用permission
,Select-String
参数支持正则表达式,请尝试以下操作:
-Pattern
垂直管道栏(Get-ChildItem "D:\Wim\TM1\TI processes" -Filter *.vue -Recurse |
Select-String -Pattern "7,Id|6,Default" -CaseSensitive |
Out-File C:\test.txt
)充当替代分隔符,或者换句话说,“或”运算符。使用该模式,它将匹配。