Сценарий оболочки для условного удаления дочерних тегов xml

Так как мы можем использовать apt, таким образом:

apt-get install mysql=8.0.15-1debian9

Мы можем использовать ansible apt таким же образом:

apt: name=mysql=8.0.15-1debian9 state=installed
3
22.03.2021, 13:07
2 ответа

Хотя это и возможно, очень, очень плохая идея пытаться анализировать XML или HTML с помощью таких инструментов, как sed, основанных на регулярных выражениях. Это может сработать для простых случаев, но очень трудно сделать правильно даже для экспертов даже для немного более сложных случаев. Таким образом, используйте синтаксический анализатор XML, такой как xmlstarlet(, который можно установить из репозиториев вашей операционной системы ):

.
$ xmlstarlet ed -d '//client/clientRef' file.xml  
<?xml version="1.0"?>
<contracts>
  <clients>
    <client>
      <name>Nicol</name>
    </client>
    <client>
      <name>Basil</name>
    </client>
  </clients>
  <entries>
    <entry>
      <regCode>BCG</regCode>
      <clientRef>63352</clientRef>
    </entry>
    <entry>
      <regCode>TYD</regCode>
      <clientRef>3242</clientRef>
    </entry>
  </entries>
</contracts>

edозначает «редактировать этот файл», а -d '//client/clientRef'означает «удалить clientRefзаписи в client».


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

$ awk '{ 
        if(/<clients>/){a=1}
        else if(/<\/clients>/){a=0} 
        if(/<clientRef>/ && a){ next}
       }1;' file.xml 
<contracts>
    <clients>
        <client>
            <name>Nicol</name>
        </client>
        <client>
            <name>Basil</name>
        </client>
    </clients>
    <entries>
        <entry>
            <regCode>BCG</regCode>
            <clientRef>63352</clientRef>
        </entry>
        <entry>
            <regCode>TYD</regCode>
            <clientRef>3242</clientRef>
        </entry>
    </entries>
</contracts>  
13
28.04.2021, 22:58

Использование xqсинтаксического анализатора XML (части yq), который является оболочкой для jq(, поэтому он выполняет преобразование XML/JSON -кодирование):

$ xq -x 'del(.contracts.clients.client[].clientRef)' file.xml
<contracts>
  <clients>
    <client>
      <name>Nicol</name>
    </client>
    <client>
      <name>Basil</name>
    </client>
  </clients>
  <entries>
    <entry>
      <regCode>BCG</regCode>
      <clientRef>63352</clientRef>
    </entry>
    <entry>
      <regCode>TYD</regCode>
      <clientRef>3242</clientRef>
    </entry>
  </entries>
</contracts>
1
30.04.2021, 18:15

Теги

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