我正在寻找这个问题的解决方案,并怀疑awk应该提供一个简单的解决方案而不是我笨拙的shell脚本。
我有一个由多个部分组成的xml文件,如下所示。我还有一个值列表。
对于我的列表中value_x所在的每个部分<top_tag> ... </top_tag>
,删除(即:不打印)部分<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>
非常感谢您的建议。
答案 0 :(得分: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"?>
答案 1 :(得分:2)
这可能对您有用:
sed -i '/<top_tag>/,/<\/top_tag>/!b;/<top_tag>/{h;d};H;/<\/top_tag/!d;x;/<tag>value.*<\/tag>/d' file