Shell

如何搜尋 XML 塊並刪除它

  • March 29, 2020

這是我的 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 隨時可能發生變化,自動化腳本將失敗。

謝謝

使用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>

引用自:https://unix.stackexchange.com/questions/576750