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

现在,我需要修改现有的 shell 脚本以注释该部分,如下所示:

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

是否可以通过 shell 脚本评论上述 2 个条目以进行评论?我可以替换任何出现的 ,因为我只有一个这样的唯一事件,但如果 /mycompany/pqr 节点,我无法替换 </entry> 结束标记,因为如果我尝试用 < 替换它,所有匹配项都将被替换/入口 -->

关于如何在 shell 脚本中替换这个关闭节点的任何想法?

谢谢!

4

2 回答 2

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 版本不能与嵌套标签一起正常工作。

-缺口

于 2012-10-09T22:26:34.120 回答
0

免责声明:我认为对 XML 文件使用 awk/sed/... 是个坏主意;如果格式更改,标签之间的行号不同,您最终会得到一个 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
于 2012-10-10T00:13:53.743 回答