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와 일치하는 모든 서버를 제거하는 것입니다.

출력은 다음 콘텐츠를 파악하고 새 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>

관련 정보