如何搜尋 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>

相關內容