在 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
我已经能够匹配多行;但前提是我知道有多少行,以及这些行的内容是什么...
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
开关提供的。根据需要,在传递给
激活 bothSelect-String
的-Pattern
参数的正则表达式中,使用内联regex optionm
(多行)来使^
和$
匹配 每行的开头和结尾 ((?m)
) and/or 选项s
(单个-line) 使.
也匹配换行符 ("`n"
) ((?s)
);你可以用(?sm)
.
这是一个使用多行 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