我有一个 sed 模式搜索如下:
sed -n '/<centerline/,/<\/centerline/p'
这会找到介于<centerline>
和之间的所有内容</centerline>
<centerline id ="sid*" >
我想忽略所有在接下来关闭之前的情况</centerline>
基本上,我想包括除中心线为 sid 的情况之外的所有中心线。下面给出的一些片段包括在内:
<centerline id ="star12L" >
<polyline>
<point x="487610.06" y="2803975.46" />
<point x="501348.98" y="2795594.35" />
</polyline>
</centerline>
要排除:
<centerline id ="sid12L" >
<polyline>
<point x="501348.98" y="2795594.35" />
<point x="487610.06" y="2803975.46" />
</polyline>
</centerline>
我怎样才能做到这一点?
谢谢!
答案1
假设 XML 文件类似于
<?xml version="1.0"?>
<root>
<centerline id="star12L">
<polyline>
<point x="487610.06" y="2803975.46"/>
<point x="501348.98" y="2795594.35"/>
</polyline>
</centerline>
<centerline id="sid12L">
<polyline>
<point x="501348.98" y="2795594.35"/>
<point x="487610.06" y="2803975.46"/>
</polyline>
</centerline>
<centerline id="star12R">
<polyline>
<point x="487610.06" y="2803975.46"/>
<point x="501348.98" y="2795594.35"/>
</polyline>
</centerline>
</root>
XML小星将能够解析出两个centerline
没有id
以字符串开头的属性的节点sid
:
$ xmlstarlet sel -t -c '//centerline[starts-with(@id,"sid") = false]' -nl file.xml
<centerline id="star12L">
<polyline>
<point x="487610.06" y="2803975.46"/>
<point x="501348.98" y="2795594.35"/>
</polyline>
</centerline><centerline id="star12R">
<polyline>
<point x="487610.06" y="2803975.46"/>
<point x="501348.98" y="2795594.35"/>
</polyline>
</centerline>
这X路径查询的//centerline[starts-with(@id,"sid") = false]
意思是“匹配文档中任何位置centerline
的每个id
属性不以字符串开头的”。sid
在命令行-c
上xmlstarlet
,我们请求与查询匹配的节点的副本。
只是为了表明这xmlstarlet
比仅在标签之间提取内容稍微强大一些:
要获取这些结构中节点的x
和值(以适当的前缀):y
point
centerline
centerline
id
$ xmlstarlet sel -t -m '//centerline[starts-with(@id,"sid") = false]/polyline/point' \
-v 'concat(../../@id, ":", @x, ",", @y)' -nl file.xml
star12L:487610.06,2803975.46
star12L:501348.98,2795594.35
star12R:487610.06,2803975.46
star12R:501348.98,2795594.35
品牌仅-m
xmlstarlet
匹配给定的节点(polyline/point
非排除centerline
节点下的节点),而以下-v
查询获取由 组成的值concat()
。连接concat()
(“连接”)我们想要为每个匹配point
节点(../../@id
指节点id
中的属性centerline
)获取的字符串。