相关文章推荐
果断的围巾  ·  OpenXml ...·  2 月前    · 
闯红灯的柿子  ·  Content-Type: ...·  1 年前    · 

Is it possible to comment the above 2 entries to comment via shell script? I can replace any occurrence of with since I've only one such unique occurrence but I'm not able to replace </entry> closing tag if /mycompany/pqr node since all occurrences will get replaced if I try to replace it with </entry -->

有什么办法可以在shell脚本中替换这个关闭节点?

4 个评论
使用一个xslt处理器和样式表。在所有节点上使用模板匹配,按原样输出节点 - 然后创建第二个模板,匹配你想排除的内容,不发出任何东西。
Mike
xslt processor in shell script???
如果你需要一个 "纯 "shell脚本的替代品,我会看看sed或awk。
Mike
I already have shell script & need an alternate with shell script only. Can any one provide an example on how to do this using sed or awk?
linux
unix
Mike
Mike
发布于 2012-10-10
2 个回答
mythagel
mythagel
发布于 2012-10-10
已采纳
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

which will give you:

<?xml version="1.0"?>
<property name="myData">
            <entry key="/mycompany/xyz">
                <value>Sara</value>
            </entry>
    </property>

如果你真的需要这些节点被注释出来,那么我的xslt-foo就不够强大--你可能需要<xsl:comment>

编辑:用awk解决。

awk '/<entry key="\/mycompany\/(abc|pqr)">/,/<\/entry>/ {p=1}; /.*/{ if(p==0) {print;}; p=0 }' blah.xml

Result:

<property name="myData">
        <entry key="/mycompany/xyz">
            <value>Sara</value>
        </entry>
</property>

请注意,awk版本在嵌套的标签下将无法正常工作。

-nick

Mike
你的awk脚本看起来很酷。如果你能解释一下你的awk脚本,特别是标志p=1等,我将非常感激。
当然,第一部分匹配一个多行模式,以包含'abc'或'pqr'的mycompany键的条目标签开始。逗号指定了这是一个范围,以关闭的入口标签为终点。当该模式被匹配时,它将变量'p'设置为1。第二部分匹配所有的字符串并打印出来,如果p是零的话(即如果我们做了什么,则打印出来 not 匹配之前的模式)。在打印出文本后,它将p重置为零,以继续打印下一个文本块。
tink
tink
发布于 2012-10-10
0 人赞同

免责声明:我认为使用awk/sed/...处理XML文件是个坏主意;如果格式改变了,你的标签之间的行数不同,你最终会得到一个糟糕的XML文件。

    BEGIN{
      count=-6
      if( $0 !~ /\/mycompany\/pqr/ && NR != count+5){
            print $0
      if( $0 ~ /\/mycompany\/pqr/) {
        count=NR; 
        print gensub( /(entry)/, "!-- \\1", "1" )
      }else{
        print gensub( /(entry)/, "\\1 --", "1" )