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

相关内容