쉘을 사용하여 패턴 일치를 수행하고 xml 파일의 태그 교체

쉘을 사용하여 패턴 일치를 수행하고 xml 파일의 태그 교체

아래와 같이 입력 XML 파일이 있습니다.

입력 파일

<ReconSummary>
<entryName>Total Deep</entryName>
<Code>777</Code>
<License>L</License>
<Tran>H20</Tran>
<job>1234</job>
</ReconSummary>


<ReconSummary>
<entryName>Total Saurav</entryName>
<Code>666</Code>
<License>L</License>
<Tran>H20</Tran>
<job>1234</job>
</ReconSummary>


<ReconSummary>
<entryName>Total Ankur</entryName>
<Code>555</Code>
<License>L</License>
<Tran>H20</Tran>
<job>1234</job>
</ReconSummary>

"Total Deep" 패턴을 찾으면 출력 파일이 다음과 같이 보이도록 해당 태그에 주석을 달고 싶습니다.

산출

<!--<ReconSummary>
<entryName>Total Deep</entryName>
<Code>777</Code>
<License>L</License>
<Tran>H20</Tran>
<job>1234</job>
</ReconSummary>-->


<ReconSummary>
<entryName>Total Saurav</entryName>
<Code>666</Code>
<License>L</License>
<Tran>H20</Tran>
<job>1234</job>
</ReconSummary>


<ReconSummary>
<entryName>Total Ankur</entryName>
<Code>555</Code>
<License>L</License>
<Tran>H20</Tran>
<job>1234</job>
</ReconSummary>

저는 쉘 스크립팅을 처음 접하기 때문에 쉘 스크립팅을 사용하여 이를 적용하는 방법을 이해하도록 도와줄 수 있는 사람이 있습니까?

답변1

xmlstarlet다음과 같은 XML 구문 분석 도구를 사용하는 것은 쉽습니다 .삭제특정 XPATH 패턴과 일치하는 XML 비트입니다.

이 경우 ReconSummary하위 노드 값이 다음과 같은 모든 노드를 삭제하려면 다음을 수행하십시오.entryNameTotal Deep

xmlstarlet ed -d '//ReconSummary[entryName = "Total Deep"]' file.xml >newfile.xml

...파일이 올바른 형식의 XML 파일이라고 가정합니다(귀하의 예에는 단일 최상위 노드가 없기 때문에 그렇지 않습니다).

그러나댓글 달기약간의 XML은 약간 까다롭고 xmlstarlet직접적으로 수행할 수 없습니다.

대신 XSL 변환을 적용하여 XML을 다시 작성할 수 있습니다.

사용답변비슷한 질문인 XSL 변환을 작성했습니다.

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <xsl:template match="/|node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="//ReconSummary[entryName = 'Total Deep']">
    <xsl:text disable-output-escaping="yes">&lt;!-- </xsl:text>
    <xsl:copy-of select="."/>
    <xsl:text disable-output-escaping="yes"> --&gt;</xsl:text>
  </xsl:template>

</xsl:transform>

XML 주석 태그는 하위 노드에 값이 있는 각 노드 주위에 삽입됩니다 <!--.-->ReconSummaryentryNameTotal Deep

다음 방법 중 하나를 사용하여 이 XSL 변환을 XML 파일에 적용할 수 있습니다.

xmlstarlet tr transform.xsl file.xml >newfile.xml

또는

xsltproc transform.xsl file.xml >newfile.xml

파일이 있는 위치 file.xml와 변환이 transform.xsl.

관련 정보