Удалить строки до / после в xml, сопоставив значение тега - PullRequest
0 голосов
/ 14 сентября 2018

В приведенном ниже XML-фрагменте мне нужно удалить ненужные строки, соответствующие значению идентификатора артефакта:

    <groupID>com.test</groupID>
    <artifactID>nginx-node</artifactID>
    <verion>1.0</version>
    <groupID>com.test</groupID>
    <artifactID>nginx-node</artifactID>
    <verion>1.1</version>
    <groupID>com.test</groupID>
    <artifactID>nginx</artifactID>
    <verion>1.2</version>

Мне нужно удалить все текущие строки XML до и после, сопоставив значение идентификатора артефакта, т.е.«nginx-узел» в указанном выше XML-файле

попытка команды:

grep -iv "nginx-node" file.

Фактический вывод:

 <groupID>com.test</groupID>
    <verion>1.0</version>
    <groupID>com.test</groupID>
    <verion>1.1</version>
    <groupID>com.test</groupID>
    <artifactID>nginx</artifactID>
    <verion>1.2</version
    **Expected output:**
    <groupID>com.test</groupID>
    <artifactID>nginx</artifactID>
    <verion>1.2</version>

1 Ответ

0 голосов
/ 04 октября 2018

Это требует многострочной операции поиска и замены, например, с использованием Perl.Действительно, работа с одной строкой выполняется:

perl -i -0pe "s/^\s*\S*\s*<artifactID>nginx-node<\/artifactID>\s*\S*\s*$//gm" input.txt

Демо-версия регулярного выражения (см. Объяснение регулярного выражения справа)

Объяснение флагов:

  • -i указывает Perl выполнить замену на месте, то есть немедленно обновить входной файл.(Опустите эту опцию для пробного запуска)
  • -0 переводит Perl в режим «файл slurp», т.е. весь входной файл читается в одном, а не в построчном порядке.Это позволяет выполнять многострочный поиск и замену.
  • -pe позволяет запускать код Perl напрямую, в нашем случае сопоставление и замена шаблонов.

Если вы хотите найти и заменить вболее одного файла, вы связываете его с find и xargs, например,

find ~/mystuff -name "*.txt" | xargs perl -i -0pe 's/regex/replacement/g'
...