如何用Shell核心命令筛选含指定age的XML client标签
筛选XML中age等于18的client标签
我有如下XML文件:
<clients> <client> <name>Bob</name> <age>18</age> </client> <client> <name>Alice</name> <age>12</age> </client> <client> <name>Carlos</name> <age>28</age> </client> </clients>
需要仅筛选出age等于18的client标签。我先用以下命令获取所有client标签:
sed -n '/client>/,/<\/client/p' test.xml
执行结果返回了全部三个client节点:
<client> <name>Bob</name> <age>18</age> </client> <client> <name>Alice</name> <age>12</age> </client> <client> <name>Carlos</name> <age>28</age> </client>
尝试了以下命令但未达到预期效果:
sed -n '/client>(\<age>18<\/age>)/<\/client/p' test.xml
由于无法下载外部工具,只能使用Shell核心命令,期望得到的结果是:
<client> <name>Bob</name> <age>18</age> </client>
解决方案
使用sed的暂存空间处理多行区块,命令如下:
sed -n '/<client>/,/<\/client>/{H;/<\/client>/{x;/<age>18<\/age>/p;x}}' test.xml
命令说明:
/<client>/,/<\/client>/:定位每个client节点的完整内容区块H:将当前行内容追加到暂存空间,逐步保存整个client区块- 当匹配到
</client>时:x:交换暂存空间和模式空间,此时模式空间中是完整的client区块内容/<age>18<\/age>/p:如果区块包含<age>18</age>,则打印该区块x:交换回暂存空间和模式空间,保证后续处理不受影响
执行该命令后即可得到目标结果。
内容的提问来源于stack exchange,提问作者culpinha
相关产品推荐
相关产品推荐

