[我是 PowerShell 的初学者]
我想使用 PowerShell 从某个目录下的所有文件中提取特定模式。我怎么做?
例如,让文件内容为:
<node1>Hello World ignore</node1>
<wantedNode>Hello World extract
this text </wantedNode>
我只想提取包含“hello world”类型的节点(不区分大小写):
"Hello World extract this text"
[我是 PowerShell 的初学者]
我想使用 PowerShell 从某个目录下的所有文件中提取特定模式。我怎么做?
例如,让文件内容为:
<node1>Hello World ignore</node1>
<wantedNode>Hello World extract
this text </wantedNode>
我只想提取包含“hello world”类型的节点(不区分大小写):
"Hello World extract this text"
如果文件是正确的 XML 文档,那么这很容易,例如:
Get-ChildItem *.xml | Select-Xml '//wantedNode' | Format-List Path, @{n="Text";e={$_.Node.InnerText}}
如果 XML 文档有默认命名空间,这会有点棘手,但并不多。如果您需要进行正则表达式搜索,那么因为感兴趣的文本跨越多行,您需要将文件作为单个字符串读取,例如:
[IO.File]::ReadAllText("$pwd\test.xml") |
Select-String '(?s)(?<=\<wantedNode\>)(.*?)(?=\</wantedNode\>)' |
Format-List Matches
在 PowerShell v3 中,这变得有点简单:
Get-Content .\test.xml -Raw |
Select-String '(?s)(?<=\<wantedNode\>)(.*?)(?=\</wantedNode\>)' |
Format-List Matches
试试这个,我添加了一个根节点:
[xml]$xml=@"
<root>
<node1>Hello World ignore</node1>
<wantedNode>Hello World extract this text</wantedNode>
</root>
"@
$xml.SelectNodes("//wantedNode[contains(.,'Hello World')]") | foreach {$_.'#text'}
谷歌搜索了一段时间后,我想出了一个解决方案:
$files = gci -Recurse
foreach ($file in $files)
{
$x = [xml] (Get-Content $file.FullName)
foreach ($node in $x.SelectNodes("//wantedNode"))
{
if ($node.InnerText -like "*Hello World*" )
{
Write-Host $node.InnerText
}
}
}