通过shell脚本替换节点

时间:2012-10-09 19:09:17

标签: linux unix

我的代码库中包含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文件的一部分。我有一个现有的shell脚本,它替换了上面文件中的一些数据。

现在,我需要修改现有的shell脚本来评论该部分,如下所示:

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

是否可以通过shell脚本评论以上2个条目进行评论?我可以替换任何事件,因为我只有一个这样的独特事件,但我无法替换&lt; / entry&gt;关闭标记if / mycompany / pqr节点,因为如果我尝试用&lt; / entry - &gt;

替换它,所有出现的都将被替换

有关如何在shell脚本中替换此结束节点的任何想法吗?

谢谢!

2 个答案:

答案 0 :(得分: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>

然后通过shell脚本使用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版本无法与嵌套标记一起正常使用。

-nick

答案 1 :(得分:0)

免责声明:我认为将awk / sed / ...用于XML文件是一个坏主意;如果格式更改,则标记之间的行号不同,最后会出现一个bung XML文件。

    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