xml - 模式匹配后如何删除匹配块
问题描述
这是文件(将其命名为 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>
解决方案
blah2
用 xmlstarlet删除第二个标签:
xmlstarlet edit --delete '//configs[blah2[2]/blah1/blah1[@value="def"]]/blah2[2]' file.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>
如果要就地编辑文件,请添加选项 -L。
使用的XPath说明:
//configs[blah2[2]/blah1/blah1[@value="def"]]/blah2[2]
|---A---| |-------------B------------------| |---C---|
A 和 B:您要查找的属性的路径
A和C:要删除的标签的路径
推荐阅读
- sed - sed -i 用反斜杠替换字符串
- apache-spark - 使用合并后如何从 Delta 表中获取新/更新的记录?
- python - 如何在 Python 中绘制函数 ax^2+bxy+cy^2+d=0?
- qt - 如何自定义 Popup 关闭行为?
- java - 当我在 Eclipse 中运行时,Forge 无法正常工作
- typescript - 等待函数完成然后返回对象
- python - 如何修复 DetailView 缺少 QuerySet 错误?
- php - 虽然循环条件奇怪的行为php
- python - 如何修改数据以更好地绘制/解释图表
- java - 如何使用嵌套循环查找重复项是 List