シェルを使用してパターンマッチングを実行し、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

おすすめ記事