在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命令

powershell脚本隐藏退出码

在 windows 10 powershell 中使用 sqlplus 执行 sql 文件

如何在 powershell 中使用变量调用命令?

如何在 powershell 远程会话(powershell)中编辑文件