我正在尝试编写PowerShell脚本来替换我放入XML文件的标记内容。标签在XML中出现多次,这导致第一个和最后一个标签之间的所有内容都被替换,因为它没有在第一次找到结束标记时停止。
我正在使用它:
$NewFile = (Get-Content .\myXML_file.xml) -join "" | foreach{$_ -replace "<!--MyCustom-StartTag-->(.*)<!--MyCustom-EndTag-->","<!--MyCustom-StartTag-->New Contents of Tag<!--MyCustom-EndTag-->"};
Set-Content .\newXMLfile.xml $newfile;
该文件包含以下内容:
<!--MyCustom-StartTag-->
Lots of content
<!--MyCustom-EndTag-->
More stuff here
<!--MyCustom-StartTag-->
Lots of content
<!--MyCustom-EndTag-->
我最终得到了:
<!--MyCustom-StartTag-->
New Content Here
<!--MyCustom-EndTag-->
而不是:
<!--MyCustom-StartTag-->
New content
<!--MyCustom-EndTag-->
More stuff here
<!--MyCustom-StartTag-->
New content
<!--MyCustom-EndTag-->
我尝试过使用:(?!MyCustom-StartTag)
,但这确实有效。
我应该怎样做才能让它发挥作用。
谢谢, 理查德
答案 0 :(得分:6)
您应该使用{1 {}的非贪婪版本,即*
。有关详细信息,请参阅:http://www.dijksterhuis.org/csharp-regular-expression-operator-cheat-sheet/(Powershell使用与C#相同的正则表达式引擎)。
*?
答案 1 :(得分:0)
我认为您只剩下一对开始和结束标记的原因是因为您的查询模式在搜索字符串中找到三个匹配项。
第一对开始和结束。
第二对开始和结束。
从第一个开始,从第二个开始结束标记(如果最后找到这个匹配,它实际上会用新值替换第一个和最后一个之间的所有内容)。
所以在你的“(。*)”中你可能不得不排除任何其他的开始和结束标签?