Grep заменяет в нескольких xml-файлах

У меня есть команда, чтобы найти все файлы .xml, содержащие <active>true</active>, имеющие <codePool>community</codePool> после этой строки в следующей строке.

grep -rzl '<active>true</active>.*<codePool>community</codePool>' --include='*.xml' --color=always

Теперь, как объединить это с sed заменить строку true внутри тега <active>... на строку false вдоль этих совпадающих строк?

1
задан 10 November 2016 в 14:52

1 ответ

Вы должны использовать инструменты синтаксического анализа XML для данных XML. xmlstarlet - хороший выбор. Регулярные выражения недостаточно эффективны (каноническая ссылка)

Если ваши данные выглядят так:

<root>
  <foo>
    <active>true</active>
    <codePool>private</codePool>
  </foo>
  <foo>
    <active>true</active>
    <codePool>community</codePool>
  </foo>
</root>

Затем

xmlstarlet ed --update '//active[.="true" and ../codePool="community"]' -v false file.xml

создает

<?xml version="1.0"?>
<root>
  <foo>
    <active>true</active>
    <codePool>private</codePool>
  </foo>
  <foo>
    <active>false</active>
    <codePool>community</codePool>
  </foo>
</root>

Вот awk-программа, которая делает то, что вы запрашиваете. Имейте в виду, что он хрупкий: если вход изменяется, этот код перестанет работать. Он просто использует простые операции с строкой.

awk '
    BEGIN {
        marker = "<codePool>community</codePool>"
        srch = "<active>true</active>"
        repl = "<active>false</active>"
    }
    index($0, marker) {
        i = index(prev, srch)
        if (i > 0) 
            prev = substr(prev, 1, i-1) repl substr(prev, i+length(srch))
    }
    {
        if (prev) print prev
        prev = $0
    }
    END {if (prev) print prev}
'
2
ответ дан 23 May 2018 в 04:21
  • 1
    Эта каноническая ссылка нуждается в обновлении для XHTML- & gt; "XML вообще". Я боюсь, что автор был съеден Тони Пони. – SusanW 10 November 2016 в 19:06
  • 2
    @glennjackman, ваш ответ довольно хорошо, но я работаю над удаленным SSH, принадлежащим клиенту, поэтому у меня нет разрешения на установку в его систему стороннего программного обеспечения / библиотеки. Пожалуйста, предложите также альтернативу этой ubuntu или любой известной командной строке Linux. – Vicky Dev 10 November 2016 в 19:17

Другие вопросы по тегам:

Похожие вопросы: