在 Powershell 中用 Select-String 匹配未知数量的多行未知数量的行?

Matching an unknown number of multi-lines an unknown number of lines with Select-String in Powershell?

我已经能够匹配多行;但前提是我知道有多少行,以及这些行的内容是什么...

Select-String -Pattern "^Timestamp: 3/27/2021.*`n`n|^Message:.*errorText:" -Context 2 -LiteralPath .\SomeLog.log

有没有办法在不知道中间是什么的情况下匹配多行?

例如匹配

[START]
...
...
[END]

我读了一些关于更改 settings to the regex with (?sme) 的内容,但它似乎不起作用。

我正在尝试如下操作:

Select-String -Pattern '(sme?)\[START\].*\n(.*\n)\+\[END\]'

使Select-String匹配多行子串:

  • 您必须将输入作为 单行、多行 字符串提供,这是 Get-Content-Raw 开关提供的。

  • 根据需要,在传递给Select-String-Pattern参数的正则表达式中,使用内联regex optionm(多行)来使 ^$ 匹配 每行的开头和结尾 ((?m)) and/or 选项 s (单个-line) 使 . 也匹配换行符 ("`n") ((?s));你可以用 (?sm).

    激活 both

这是一个使用多行 here-string 作为输入的示例,而不是
Get-Content -Raw file.txt:

(@'
before
[START]
...1
...2
[END]
after
[START]
...3
...4
[END]
done
'@ | 
  Select-String  -AllMatches -Pattern '(?sm)^\[START\]$.+?^\[END\]$'
).Matches.Value -join "`n------------------------`n"

注意:严格来说,只有[]不需要转义\

如果您只想找到 第一个 块匹配行,请忽略 -AllMatches谢谢,Wiktor Stribiżew
-AllMatches 请求 return 对每个输入字符串 进行所有匹配 ,并且通常是 - 逐行 输入 -用于在每行 中查找多个匹配项。这里,对于 multiline 输入字符串,it 中的所有(可能是多行)匹配都是 returned.

输出:

[START]
...1
...2
[END]
------------------------
[START]
...3
...4
[END]

如果你只想return 分隔符行之间:

(@'
before
[START]
...1
...2
[END]
after
[START]
...3
...4
[END]
done
'@ | 
  Select-String  -AllMatches -Pattern '(?sm)^\[START\]\r?\n(.*?)\r?\n\[END\]$'
).Matches.ForEach({ $_.Groups[1].Value }) -join "`n------------------------`n"

注意:\r?\n 匹配 Windows 格式的 CRLF 和 Unix 格式的 LF-only 换行符。使用 \r\n / \n 只匹配前者/后者。

输出:

...1
...2
------------------------
...3
...4