我正在尝试编写一个带有 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