在Powershell中匹配未知数量的多行未知数量的行与Select String



我已经能够匹配多行;但前提是我知道接下来会有多少行,这些行的内容是什么。。。

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

有没有一种方法可以在不知道中间是什么的情况下匹配多条线?

例如匹配

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

我读到一些关于用(?sme(更改正则表达式设置的内容,但它似乎不起作用。

我正在尝试以下内容:

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

使Select-String多行子字符串匹配:

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

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

以下是一个示例,其中多行Here字符串用作输入,而不是
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请求返回每个输入字符串的所有匹配项,并且通常在逐行输入的情况下,用于查找每行的多个匹配项。这里,对于多行输入字符串,将返回it内的所有(可能是多行(匹配项。

输出:

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

如果您想只返回分隔符行之间的

(@'
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换行符。使用rn/n仅匹配前者/后者

输出:

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

最新更新