使用Powershell查找文件中的多行模式

Jef*_*ang 6 regex powershell pattern-matching

如何使用Powershell在文件中找到多行模式,例如XML节点的内容?

即如果我在deviceDescription节点中寻找"绿色"一词,但XML节点文本可能跨越多行,这不起作用:

dir -r -i *.xml | select-string -Pattern "<deviceDescription>.*green.*</deviceDescription>"
Run Code Online (Sandbox Code Playgroud)

man*_*lds 10

首先,如果是xml,则解压缩设备描述字符串,然后匹配所需的字符串,在本例中为绿色.

$x = [xml] (gc .\test.xml)
$x.deviceDescription -match "green"
Run Code Online (Sandbox Code Playgroud)

如果你不想这样,你将不得不使用?s- singleline或dotall标志,使*匹配换行符:

$x = [IO.File]::ReadAllText("C:\test.xml")
$x -match "(?s)<deviceDescription>.*green.*</deviceDescription>"
Run Code Online (Sandbox Code Playgroud)

请注意,您可能希望使用.*?或者这可能跨越多个deviceDescription标记.像这样的边缘情况是你应该避免使用正则表达式来解决这些问题的原因.