Grep и заменить текст специальными символами - PullRequest
0 голосов
/ 23 мая 2019

У меня есть 10K + XML, где примерно у половины из них есть следующая строка кода, которую я хотел бы заменить:

<protocol_name_from_source><![CDATA[This section will be completed when reviewed by an Expert Review Panel.]]></protocol_name_from_source>

на это:

<protocol_name_from_source><![CDATA[Not applicable.]]></protocol_name_from_source>

Мне удалось успешно grep для затронутых файлов: grep -rl '<process\_review><\!\[CDATA\[<p>The Expert Review Panel has not reviewed this measure yet\.<\/p>\]\]><\/process\_review>' ./

, но я не могу заменить текст на sed:

grep -rl '<process\_review><\!\[CDATA\[<p>The Expert Review Panel has not reviewed this measure yet\.<\/p>\]\]><\/process\_review>' ./ | xargs sed -i 's/<process\_review><\!\[CDATA\[<p>The Expert Review Panel has not reviewed this measure yet\.<\/p>\]\]><\/process\_review>/<process\_review><\!\[CDATA\[<p>Not applicable\.<\/p>\]\]><\/process\_review>/g'

Заранее признателен за любую помощь.

edit: эти XML-файлы находятся в git-репо.Есть ли риск испортить репо?

1 Ответ

0 голосов
/ 23 мая 2019

Хм, согласно моей man-странице, опция sed -i должна следовать с одним (в конечном итоге 0 длиной) расширением.И параметр команды должен быть введен с -e, если это не единственный параметр команды.

Так что здесь я бы использовал:

grep -rl '<process\_review><\!\[CDATA\[<p>The Expert Review Panel has not reviewed this measure yet\.<\/p>\]\]><\/process\_review>' ./ | xargs sed -i '' -e 's/<process\_review><\!\[CDATA\[<p>The Expert Review Panel has not reviewed this measure yet\.<\/p>\]\]><\/process\_review>/<process\_review><\!\[CDATA\[<p>Not applicable\.<\/p>\]\]><\/process\_review>/g'

Осторожно, яне просматривал (long ...) sed s/.../.../ команду ...

...