在Powershell中使用Select-String匹配未知数量的多行和未知数量的行?
Posted
技术标签:
【中文标题】在Powershell中使用Select-String匹配未知数量的多行和未知数量的行?【英文标题】:Matching an unknown number of multi-lines an unknown number of lines with Select-String in Powershell? 【发布时间】:2021-12-30 15:02:53 【问题描述】:我已经能够匹配多行;但前提是我知道有多少行,以及这些行的内容是什么......
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\]'
【问题讨论】:
.NET 正则表达式中没有e
标志,?
紧跟在(
之后。只需使用Get-Content $fpath -Raw | Select-String -Pattern '(?s)\[START].*?\[END]' -AllMatches | % $_.matches.value
见(原型)建议:#15136
Add -From
and -To
parameters to Select-String
该文件可能有 Windows 格式的换行符 (CRLF)。您现在假设它具有 *nix 样式(仅限 LF)
【参考方案1】:
使Select-String
匹配多行子字符串:
您必须将输入提供为单行字符串,这是Get-Content
的-Raw
开关提供的。
根据需要,在传递给Select-String
的-Pattern
参数的正则表达式中,使用内联regex optionm
(多行)使^
和$
匹配每一行((?m)
)和/或选项s
(单行)使.
也匹配换行符("`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
请求返回所有匹配每个输入字符串,并且通常 - 使用 逐行 输入 - 用于查找多个匹配每行。在这里,使用 multiline 输入字符串,返回 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-only 换行符。使用\r\n
/ \n
只匹配前者/后者。
输出:
...1
...2
------------------------
...3
...4
【讨论】:
以上是关于在Powershell中使用Select-String匹配未知数量的多行和未知数量的行?的主要内容,如果未能解决你的问题,请参考以下文章
在 PowerShell 中使用特定配置文件启动 Chrome
Powershell中命令自动补全功能及使用Windows命令