RegEx и заменить - PullRequest
       3

RegEx и заменить

2 голосов
/ 16 июня 2011

У меня есть сценарий Powershell, который я пытаюсь написать, чтобы перейти через плохо отформатированный XML-файл, чтобы найти любые узлы, в которых слово «Date» является частью имени узла. И.Е.

<System><SystemName>Acme</Systemname><SystemDate>313</SystemDate><SystemNumber>3</SystemNumber><FileDate>394</FileDate></System>

Вышеуказанный шаблон повторяется сотни раз по всему файлу ... примерно для 70 МБ данных.

В реальном файле гораздо больше узлов, без перевода строки или чего-либо еще ... поэтому все это отображается в одной строке.

Что мне нужно сделать, это отсканировать файл и найти все узлы, которые заканчиваются на «Дата», где значение не 4-значное, и заменить его на 4-значное значение.

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

Используя приведенный выше пример, он должен найти закрывающий </SystemDate> и закрывающий </FileDate> узлы и увидеть, что цифра составляет всего 3 символа и заменить на 9999.

 $infile=get-content z:\system.txt
 write-host $infile.Length
 $regex = New-Object System.Text.RegularExpressions.Regex ">\d\d\d</(.*Date)"
 $replace = $regex.Replace($infile,"9999")
 write-host $infile.Length
 write-host $replace.Length
 set-content -Value $replace z:\new_system.txt

Буду признателен за любую помощь!

Ответы [ 2 ]

1 голос
/ 16 июня 2011

(я думаю, что вы упростили свой код ... например, вы, вероятно, хотите сказать $regex.Replace($infile,">9999</$1"))

Оставляя это в стороне, первое, что я хотел бы сделать, - это сделать соответствующее регулярное выражение более точным: ">\d\d\d</([^>]*Date)" ... Я предполагаю, что реализация регулярных выражений PowerShell является жадной, как и в других реализациях.Это может решить проблему сразу.

Если нет, я думаю, что естественным будет сделать цикл по Matches .Но метод Replace утверждает, что заменяет их всех, поэтому я думаю, что этого можно избежать.

0 голосов
/ 16 июня 2011
$xmlDocument = [XML](get-content z:\system.txt)

Сделай это в стиле XML

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