Shell
如何搜尋 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 隨時可能發生變化,自動化腳本將失敗。
謝謝
使用
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>