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

$ 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すべての属性と一致する」を意味します。コマンドラインからクエリに一致するノードのコピーを要求します。idsid-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

ブランド-mのみxmlstarletマッチノード(polyline/point除外されていないノードの下のcenterlineノード)が与えられると、次の-vクエリはで構成される値を取得しますconcat()。一致する各ノードに対して取得したい文字列を連結concat()(「結合」)しますpoint(ノードの属性../../@idを参照)。idcenterline

関連情報