Это мой XML.
<configGroup>
<type>SERVER_CONFIG</type>
<configProperty id="Server48">
<configProperty>
<name>Server Name</name>
<value>oaea_server1</value>
<itemMetadata>
<dataType>STRING</dataType>
<scope>READ_ONLY</scope>
</itemMetadata>
</configProperty>
<configProperty>
<name>Listen Address</name>
<value>server.com</value>
<itemMetadata>
<dataType>STRING</dataType>
<scope>READ_WRITE</scope>
</itemMetadata>
</configProperty>
<configProperty>
<name>Listen Port</name>
<value>6851</value>
<itemMetadata>
<dataType>INTEGER</dataType>
<scope>READ_WRITE</scope>
</itemMetadata>
</configProperty>
</configProperty>
<configProperty id="Server6">
<configProperty>
<name>Server Name</name>
<value>oacore_server2</value>
<itemMetadata>
<dataType>STRING</dataType>
<scope>READ_ONLY</scope>
</itemMetadata>
</configProperty>
<configProperty>
<name>Listen Address</name>
<value>server.com</value>
<itemMetadata>
<dataType>STRING</dataType>
<scope>READ_WRITE</scope>
</itemMetadata>
</configProperty>
<configProperty>
<name>Listen Port</name>
<value>7251</value>
<itemMetadata>
<dataType>INTEGER</dataType>
<scope>READ_WRITE</scope>
</itemMetadata>
</configProperty>
</configProperty>
</configGroup>
XML содержит множество других типов серверов, и мне требуется удалить все серверы, которые соответствуют oaea_server.
Вывод должен быть выполнен grep для нижеприведенного и удален из нового XML
<configProperty id="Server48">
<configProperty>
<name>Server Name</name>
<value>oaea_server1</value>
<itemMetadata>
<dataType>STRING</dataType>
<scope>READ_ONLY</scope>
</itemMetadata>
</configProperty>
<configProperty>
<name>Listen Address</name>
<value>server.com</value>
<itemMetadata>
<dataType>STRING</dataType>
<scope>READ_WRITE</scope>
</itemMetadata>
</configProperty>
<configProperty>
<name>Listen Port</name>
<value>6851</value>
<itemMetadata>
<dataType>INTEGER</dataType>
<scope>READ_WRITE</scope>
</itemMetadata>
</configProperty>
</configProperty>
Я пробовал использовать grep, и это тоже работает, но тогда я жестко закодировал строки до и после
grep -B 3 -n -A 22 oaea_server
Но я знаю, что это неправильный способ, так как в XML-файл в любой момент могут быть внесены изменения, и автоматизированный скрипт не будет работать.
Спасибо
решение1
Использование xmlstarletэтого метода должно сработать при правильном формированииxml
xmlstarlet ed -d "//configProperty[.//value[contains(string(), 'oaea_server')]]" file1
Вывод Server48 удален
<?xml version="1.0"?>
<configGroup>
<type>SERVER_CONFIG</type>
<configProperty id="Server6">
<configProperty>
<name>Server Name</name>
<value>oacore_server2</value>
<itemMetadata>
<dataType>STRING</dataType>
<scope>READ_ONLY</scope>
</itemMetadata>
</configProperty>
<configProperty>
<name>Listen Address</name>
<value>server.com</value>
<itemMetadata>
<dataType>STRING</dataType>
<scope>READ_WRITE</scope>
</itemMetadata>
</configProperty>
<configProperty>
<name>Listen Port</name>
<value>7251</value>
<itemMetadata>
<dataType>INTEGER</dataType>
<scope>READ_WRITE</scope>
</itemMetadata>
</configProperty>
</configProperty>
</configGroup>


