【发布时间】:2019-11-05 21:36:35
【问题描述】:
这是文件(命名为 sample.xml):
<?xml version="1.0" encoding="UTF-8"?>
<configs>
<blah1 value="ma">
<tag3>100MB</tag3>
</blah1>
<blah1 value="ba">
<tag3>20MB</tag3>
</blah1>
<blah2 value="*" version="1.0" result="true">
<blah1 value="xyz">
<blah1 value="uvw" result="true">
<tag>4</tag>
</blah1>
</blah1>
</blah2>
<!-- This is tag with def value -->
<blah2 value="*" version="2.0" result="true">
<blah1 value="abc">
<blah1 value="def" result="true">
<tag2>on</tag2>
</blah1>
</blah1>
</blah2>
</configs>
在找到带有value="def" 的字符串时,删除从<blah2> to </blah2> 标记开始的整个块
我不熟悉 sed 保持模式,但我从谷歌得到的东西非常接近
sed -n '/<blah2.*>/,/<\/blah2>/{
H
/<\/blah2>/ {
s/.*//;x
/def/d
p
}
}' sample.xml
预期结果:
<?xml version="1.0" encoding="UTF-8"?>
<configs>
<blah1 value="ma">
<tag3>100MB</tag3>
</blah1>
<blah1 value="ba">
<tag3>20MB</tag3>
</blah1>
<blah2 value="*" version="1.0" result="true">
<blah1 value="xyz">
<blah1 value="uvw" result="true">
<tag>4</tag>
</blah1>
</blah1>
</blah2>
</configs>
实际结果(使用上述非工作 sed):
<blah2 value="*" version="1.0" result="true">
<blah1 value="xyz">
<blah1 value="uvw" result="true">
<tag>4</tag>
</blah1>
</blah1>
</blah2>
【问题讨论】:
-
Don't Parse XML/HTML With Regex. 我建议使用 XML/HTML 解析器 (xmlstarlet, xmllint ...)。
-
def总是标签/configs/blah2[2]/blah1/blah1的属性吗? -
对,目前 xmlstarlet 在该主机(这是一些专有的 linux)上不可用,并且无法访问 Internet。我将不得不下载并将二进制文件移到那里。
-
是的,def 始终是第二个 blah1 中的属性
-
xmlstarlet 的答案对您有帮助吗?
标签: xml shell sed xmlstarlet