PowerShell - заменить содержимое каждого тега с помощью REGEX - PullRequest
1 голос
/ 03 ноября 2011

Я пытаюсь написать сценарий 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-->

Iпытался использовать: (?!MyCustom-StartTag), но это тоже работает.

Любые идеи о том, что я должен сделать, чтобы заставить это работать.

Спасибо, Ричард

Ответы [ 2 ]

6 голосов
/ 03 ноября 2011

Вы должны использовать не жадную версию *, а именно *?.Для получения дополнительной информации см .: http://www.dijksterhuis.org/csharp-regular-expression-operator-cheat-sheet/ (Powershell использует тот же движок регулярных выражений, что и C #).

$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;
0 голосов
/ 03 ноября 2011

Я думаю, причина того, что у вас остается только одна пара начальных и конечных тегов, заключается в том, что ваш шаблон запроса находит три совпадения в строке поиска.

  1. Первая параначало и конец.

  2. Вторая пара начала и конца.

  3. Начало от первого и конец тега от второгоодин (и если это совпадение будет найдено последним, оно фактически заменит все, что между первым и последним, новым значением).

Так что в вашем "(. *)" вывозможно, придется исключить любые другие начальные и конечные теги?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...