0

コードベースから xml のスニペットを以下に示します。

    <property name="myData">
        <map>
            <entry key="/mycompany/abc">
                <value>Mike</value>
            </entry>
            <entry key="/mycompany/pqr">
                <value>John</value>
            </entry>
            <entry key="/mycompany/xyz">
                <value>Sara</value>
            </entry>
        </map>
    </property>

上記のスニペットは XML ファイルのほんの一部です。上記のファイルのデータの一部を置き換える既存のシェル スクリプトがあります。

ここで、既存のシェル スクリプトを変更して、以下に示すようにセクションにコメントを付ける必要があります。

            <!-- entry key="/mycompany/abc">
                <value>Mike</value>
            </entry>
            <entry key="/mycompany/pqr">
                <value>John</value>
            </entry -->

上記の 2 つのエントリにコメントを付けて、シェル スクリプト経由でコメントすることはできますか? このような一意のオカレンスは 1 つしかないため、任意のオカレンスを置き換えることができますが、/mycompany/pqr ノードの場合は </entry> 終了タグを置き換えることができません。 /エントリ -->

シェルスクリプトでこの終了ノードを置き換える方法について何か考えはありますか?

ありがとう!

4

2 に答える 2

0

免責事項:XMLファイルにawk / sed/...を使用することは悪い考えだと思います。フォーマットが変更された場合、タグ間の行番号が異なると、最終的にはbungXMLファイルになります。

    BEGIN{
      count=-6
    }
    {
      if( $0 !~ /\/mycompany\/pqr/ && NR != count+5){
            print $0
            next
        }
      if( $0 ~ /\/mycompany\/pqr/) {
        count=NR; 
        print gensub( /(entry)/, "!-- \\1", "1" )
      }else{
        print gensub( /(entry)/, "\\1 --", "1" ) 
      }
    }

「something.awk」として保存し、次のように実行します。

awk -f something.awk your_file.xml
于 2012-10-10T00:13:53.743 に答える
0

次のような xslt スタイルシートを使用します。

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

 <xsl:output omit-xml-declaration="no"/>

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

    <xsl:template match="/property/map/entry[@key='/mycompany/abc']"/>
    <xsl:template match="/property/map/entry[@key='/mycompany/pqr']"/>
</xsl:stylesheet>

次に、シェル スクリプト経由で xsltproc xsl プロセッサを使用します。

$ xsltproc fix.xslt document.xml

それはあなたに与えるでしょう:

<?xml version="1.0"?>
<property name="myData">
        <map>


            <entry key="/mycompany/xyz">
                <value>Sara</value>
            </entry>
        </map>
    </property>

これらのノードをコメントアウトする必要がある場合、私の xslt-foo は十分に強力ではありません - おそらく必要になるでしょう<xsl:comment>

編集: awk を使用したソリューション:

awk '/<entry key="\/mycompany\/(abc|pqr)">/,/<\/entry>/ {p=1}; /.*/{ if(p==0) {print;}; p=0 }' blah.xml

結果:

<property name="myData">
    <map>
        <entry key="/mycompany/xyz">
            <value>Sara</value>
        </entry>
    </map>
</property>

awk バージョンは、ネストされたタグでは正しく機能しないことに注意してください。

-ニック

于 2012-10-09T22:26:34.120 に答える