XMLブロックを検索して削除する方法

XMLブロックを検索して削除する方法

これは私の 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>

関連情報