次のように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
持たない2つのノードを解析できます。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