匹配多行字符串

时间:2016-11-27 00:00:58

标签: regex powershell

我正在使用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提供仅第一个句子的列表,然后处理这些文件以查看它是否与第二个句子匹配。我想避免这种情况。

2 个答案:

答案 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)

使用permissionSelect-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 )充当替代分隔符,或者换句话说,“或”运算符。使用该模式,它将匹配。