1

我正在寻找这个问题的解决方案,并且怀疑 awk 应该提供一个足够简单的解决方案,而不是我笨拙的 shell 脚本。

我有一个由多个部分组成的 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,但不仅限于这些)也可以做到这一点。最后,如果您在 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 回答