如何在PowerShell中用Select-String匹配行数内容均未知的多行文本?
解决方案
- 首先要明确:Select-String 默认是逐行扫描输入内容的,要实现未知行数的跨多行匹配,第一步需要把目标文件的全部内容读取为单个完整字符串,不要走默认的逐行读取逻辑。
- 正确的正则写法调整:
- 内联正则修饰符要写在
(?<修饰符>)的结构里,你之前的(sme?)属于格式错误,(?s)表示开启单行模式,此时通配符.可以匹配换行符;.*?是非贪婪匹配,避免多个[START]/[END]块存在时一次性匹配所有内容 - 不需要手动枚举换行符的匹配规则,开启
(?s)后可以直接匹配任意中间内容
- 内联正则修饰符要写在
- 可直接运行的示例代码:
# 加 -Raw 参数将整个日志文件读取为单个字符串 $logContent = Get-Content -LiteralPath .\SomeLog.log -Raw # 匹配所有 [START] 到 [END] 的完整块 $logContent | Select-String -Pattern '(?s)\[START\].*?\[END\]' -AllMatches | ForEach-Object { $_.Matches.Value }
- 额外说明:如果需要同时使用多行模式(让
^/$匹配每一行的行首行尾),可以把修饰符改成(?sm)即可,正则其余部分不用调整。
内容的提问来源于stack exchange,提问作者leeand00
相关产品推荐
相关产品推荐

