Select-String - 查找跨越多行的字符串

时间:2018-01-09 15:52:11

标签: powershell

我正在尝试读取文件中的行并搜索跨越两行的模式。在notepad ++中查看文件,我在文件中看到了一个LF char。

示例log.txt:

I want to find this

value here: OK

我的简单代码不起作用,不返回任何内容:

data class Foo(val isBar1:Boolean= false,val isBar2:Boolean= false)

我在这里尝试了很多组合,包括select-string -Path "log.txt" -Pattern "find this\n*value here: OK" .+,我发现它们发布在各种线程上。我可以使用以下方式获得第一行:

\r

上述结果为:select-string -Path "log.txt" -Pattern "find this\n*"

在上面的行中添加更多内容会导致无法返回任何内容。任何想法如何使用select-string?由于我正在使用的文件的大小可能,我试图避免使用获取内容。

2 个答案:

答案 0 :(得分:4)

所以我想我理解你的问题。如果您的文件包含要关键的行,则下一行是您要查看的行:

(Select-String -Path "Log.txt" -Pattern "find this" -Context 1).Context.PostContext

我不确定回车是否是您格式化的工件。如果不是那么这会更好:

(Select-String -Path "Log.txt" -Pattern "find this" -Context 2).Context.PostContext[1]

如果你不知道两位之间有多少行,这是一种方法:

$file = Get-Content 'Log.txt' -Raw
$file -match '(?smi)I want to find this.*(value here: OK)'
$matches[1]

答案 1 :(得分:0)

由于您可能需要多行正则表达式解决方案,因此需要将文本文件作为一个字符串读取。

使用测试文件:

Stfuf
Bagel
I want to find this

value here: OK
Things

我能够使用满足您的示例文本的简单匹配模式来获得结果。

(Get-Content -Raw c:\temp\test.txt | Select-String -Pattern "([\w ]+)\s*value here: OK").Matches.Groups[1].Value

regex101.com

基本上获取不变空格之前的文本,包括换行符和静态文本"值:OK"。可以通过积极向前看做得更好,但这似乎工作正常。