1

この問題の解決策を探していますが、不器用なシェル スクリプトの代わりに awk が十分に単純な解決策を提供するはずです。

以下に示すように、複数のセクションで構成される xml ファイルがあります。値のリストもあります。

<top_tag> ... </top_tag>value_x がリストにあるセクションごとに、セクションを削除します (つまり、印刷しないでください)。<top_tag> ... </top_tag>

<xml>
<outer_tag>
   <top_tag>
      <tag>value_1</tag>
      <other_tags></other_tags>
   </top_tag>
   <top_tag>
      <tag>value_2</tag>
      <other_tags></other_tags>
   </top_tag>
    ...
   <top_tag>
      <tag>value_n</tag>
      <other_tags></other_tags>
   </top_tag>
</outer_tag>

あなたの提案は大歓迎です。

4

2 に答える 2

2

ここで必要なのは awk ではなく、この種のタスク専用に作成された XSLT です。xml ドキュメントを別の xml に変換できます。

あなたのような入力の場合:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="example.xsl"?>
<outer_tag>
   <top_tag>
      <tag>value_1</tag>
      <other_tags></other_tags>
   </top_tag>
   <top_tag>
      <tag>value_2</tag>
      <other_tags></other_tags>
   </top_tag>
   <top_tag>
      <tag>value_3</tag>
      <other_tags></other_tags>
   </top_tag>
   <top_tag>
      <tag>value_n</tag>
      <other_tags></other_tags>
   </top_tag>
</outer_tag>

次の XSLT は、要素をコピーせずに内容を無視することで、すべてのtop_tag要素を削除します。value_3

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="*">
        <xsl:element name="{name()}">           
            <xsl:apply-templates select="child::node()"></xsl:apply-templates>
        </xsl:element>
    </xsl:template>

    <xsl:template match="top_tag[tag = 'value_3']">     
    </xsl:template>
</xsl:stylesheet

すべての主要なプログラミング言語には、XSLT に従って XML 入力を処理できるライブラリが少なくともいくつかあります。コマンド ライン ツールと UI ベースのアプリケーション (IDE だけでなく、IDE) でも同様に実行できます。最後に、次のような処理命令を含む xsl ファイルを含めると、Web ブラウザーは XSLT を使用してファイルを変換できます。

<?xml-stylesheet type="text/xsl" href="example.xsl"?>
于 2012-05-26T21:50:49.403 に答える
2

これはあなたのために働くかもしれません:

 sed -i '/<top_tag>/,/<\/top_tag>/!b;/<top_tag>/{h;d};H;/<\/top_tag/!d;x;/<tag>value.*<\/tag>/d' file
于 2012-05-27T00:37:33.840 に答える