sed - 包括在 2 个模式之间找到的所有内容,但在其他模式之间找到的内容除外

sed - 包括在 2 个模式之间找到的所有内容,但在其他模式之间找到的内容除外

我有一个 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在命令行-cxmlstarlet,我们请求与查询匹配的节点的副本。


只是为了表明这xmlstarlet比仅在标签之间提取内容稍微强大一些:

要获取这些结构中节点的x和值(以适当的前缀):ypointcenterlinecenterline 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

品牌仅-mxmlstarlet匹配给定的节点(polyline/point非排除centerline节点下的节点),而以下-v查询获取由 组成的值concat()。连接concat()(“连接”)我们想要为每个匹配point节点(../../@id指节点id中的属性centerline)获取的字符串。

相关内容