我的代码库中包含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脚本中替换此结束节点的任何想法吗?
谢谢!
答案 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