使用 shell 脚本/命令注释 xml 段

使用 shell 脚本/命令注释 xml 段

我正在尝试编写一个带有 2 个参数的 shell 脚本。

xmlcomment -c cholo

或者

xmlcomment -u cholo

给定以下 xml 文件,

<?xml version="1.0"?>
<guyList>
  <guy>
    <name>paco</name>
    <fullname>Paco Tilla</fullname>
    <theme>paco</theme>
  </guy>
  <guy>
    <name>cholo</name>
    <fullname>Cholo Cote</fullname>
    <theme>cholocote</theme>
  </guy>
  <guy>
    <name>temo</name>
    <fullname>Temo Lesto</fullname>
    <theme>temol</theme>
  </guy>
</guyList>

第一个注释掉包含“<name>paco</name>”的块“<guy>”,导致文件发生以下更改。

<?xml version="1.0"?>
<guyList>
<guy>
    <name>paco</name>
    <fullname>Paco Tilla</fullname>
    <theme>paco</theme>
  </guy>
<!--
  <guy>
    <name>cholo</name>
    <fullname>Cholo Cote</fullname>
    <theme>cholocote</theme>
  </guy>
-->
  <guy>
    <name>temo</name>
    <fullname>Temo Lesto</fullname>
    <theme>temol</theme>
  </guy>
</guyList>

第二个示例只是取消注释相同的块(如果有注释),就像第一个 XML 中显示的那样。

有没有什么好的方法可以做到这一点?sed?其他 XML 编辑器?

谢谢

答案1

您可以为此使用 XSLT 处理器,例如xsltproc

<xsl:template match="guy[name='cholo']">
  <xsl:comment>
    <xsl:apply-templates select="@*|node()" />
  </xsl:comment>
</xsl:template>

这种方法并不能完全重现原始的 XML 结构,但是它会注释掉相应的guy部分。

输出为:

<guyList>
    <guy>
        <name>paco</name>
        <fullname>Paco Tilla</fullname>
        <theme>paco</theme>
    </guy>
    <!--
      cholo
      Cholo Cote
      cholocote
    -->
    <guy>
        <name>temo</name>
        <fullname>Temo Lesto</fullname>
        <theme>temol</theme>
    </guy>
</guyList>

答案2

可以做到sed(也许不是最好的方法)。脚本是相同的,只是在每种情况下替换行地址和替换内容。

sed '/<guy>/ {
    :a
    N
    /<\/guy>/ {
            /cholo/ {
                    s/^/<!--\n/
                    s/$/\n-->/
            }
    p
    d
    }
    ba
}' file-without-comment
<?xml version="1.0"?>
<guyList>
<guy>
    <name>paco</name>
    <fullname>Paco Tilla</fullname>
    <theme>paco</theme>
  </guy>
<!--
  <guy>
    <name>cholo</name>
    <fullname>Cholo Cote</fullname>
    <theme>cholocote</theme>
  </guy>
-->
  <guy>
    <name>temo</name>
    <fullname>Temo Lesto</fullname>
    <theme>temol</theme>
  </guy>
</guyList>

sed '/<!--/ {
    :a
    N
    /-->/ {
            /cholo/ {
                    s/<!--\n//
                    s/\n-->//
            }
    p
    d
    }
    ba
}' file-with-comment                                          
<?xml version="1.0"?>
<guyList>
<guy>
    <name>paco</name>
    <fullname>Paco Tilla</fullname>
    <theme>paco</theme>
  </guy>
  <guy>
    <name>cholo</name>
    <fullname>Cholo Cote</fullname>
    <theme>cholocote</theme>
  </guy>
  <guy>
    <name>temo</name>
    <fullname>Temo Lesto</fullname>
    <theme>temol</theme>
  </guy>
</guyList>

编辑于 2020 年 3 月 23 日

上述脚本适用于 GNUsed。在 BSD sed(和 Mac sed?)中,它适用于转义文字换行符。

sed '/<guy>/ {
    :a
    N
    /<\/guy>/ {
            /cholo/ {
                    s/^/<!--\
/
                    s/$/\
-->/
            }
    p
    d
    }
    ba
}' file-without-comment

但是它不适用于“取消注释”脚本,我不知道为什么。我可以用这个 sed 脚本来完成:

sed -E '/<!--|-->/d' file-with-comment

相关内容