用于将xml格式的文本替换为多行

时间:2017-08-01 14:34:51

标签: xml powershell

这是powershell脚本

$configFiles = Get-ChildItem . *.scd -rec
foreach ($file in $configFiles)
{
    (Get-Content $file.PSPath) |
    Foreach-Object { 
    $_ -replace '<Terminal .+\/>', '' `
       -replace '<Terminal [.|\n]*?<\/Terminal>', '' `
       -replace '<Private type=\"ABB.*?<\/Private>', '' `
       -replace '<ConnectivityNode.*?>.*?<\/ConnectivityNode>', '' `
       -replace '\r\n[\t\n\v\f\r ]+\r\n', '\r\n' 
    } |
    Set-Content $file.PSPath
}

第一个替换工作正常,因为标记是单行但其余部分不起作用,没有任何反应,因为它们内部也有其他标记。我想知道正确的正则表达式是什么。

这是我要用&#39;替换(第二次替换)的标签组。 &#39;正则表达式会起作用吗?

<Terminal name="T_grounded" connectivityNode="AA1/J1/Q01/grounded" 
    substationName="AA1" voltageLevelName="J1" bayName="Q01"
        cNodeName="grounded">
            <Private type="ABB SLD">
                <esld:Line>
                    <esld:Via x="244" y="116" />
                </esld:Line>
            </Private>
</Terminal> 

在Notepad ++中,它非常简单,因为你可以标记。匹配新行并替换所有行,但我不知道我们将如何在powershell脚本中对其进行调整。

先谢谢,请帮帮我。

1 个答案:

答案 0 :(得分:0)

使用模式修饰符,单行,您可以将输入视为全部一行。这使.匹配换行字符和内容。有些事情是这样的:

$test = @"
some junk
<Terminal name="T_grounded" connectivityNode="AA1/J1/Q01/grounded" 
    substationName="AA1" voltageLevelName="J1" bayName="Q01"
        cNodeName="grounded">
            <Private type="ABB SLD">
                <esld:Line>
                    <esld:Via x="244" y="116" />
                </esld:Line>
            </Private>
</Terminal> 
some more junk
"@

$test -replace "(?s)<Terminal.*Terminal>"," "

应该撕掉你想要的东西。

使用(?s) mod修饰符添加到正则表达式中,然后您可以查找节点的开始和结束。

编辑:在这种情况下,您还需要以原始数据而不是逐行读取输入。