2つのタグ/パターン間で最初のn回発生するsed結果セット

2つのタグ/パターン間で最初のn回発生するsed結果セット

大きなXMLファイルがあり、2つのタグ間で発生するすべてのイベントを取得します。

私がしたことは次のとおりです。

sed -n '/<tag>/,/<\/tag>/p' file.xml

最初のN項目のみを取得するようにフィルタリングする必要があります。 l paramを試しましたが、十分ではありません:(

それでは、すべての結果セットでN個の一致するイベントを取得する方法を知っている人はいますか?

例えば。以下はxmlファイルの内容です。

<?xml version="1.0" encoding="UTF-8"?>
<root>
<tag>
 <t1>john</t1>
 <t2>john</t2>
 <t3>john</t3>
</tag>
<tag>
 <t1>john</t1>
 <t2>john</t2>
 <t3>john</t3>
</tag>
<tag>
 <t1>john</t1>
 <t2>john</t2>
 <t3>john</t3>
</tag>
<tag>
 <t1>john</t1>
 <t2>john</t2>
 <t3>john</t3>
</tag>
</root>

 sed -n '/<tag>/,/<\/tag>/p' file.xml 

すべての要素を返します。

したがって、目標は、n = 2の場合、上位n個の一致パターン(要素は複数行)を取得するためにフィルタリングすることです。結果は次のようになります。

<tag>
 <t1>john</t1>
 <t2>john</t2>
 <t3>john</t3>
</tag>
<tag>
 <t1>john</t1>
 <t2>john</t2>
 <t3>john</t3>
</tag>

ベストアンサー1

努力する:

xmllint --xpath '//tag[position()<=2]' file.xml

または:

xmlstarlet sel -t -c '//tag[position()<=2]' file.xml

または:

xmlstarlet sel -t -m '//tag[position()<=2]' -c . -n file.xml

これを使用したい場合は、sed次のようにできます。

sed -n '
  1{x;s/^/../;x;}; # initialise counter with two tokens
  /<tag>/,/<\/tag>/ {
    p; /<\/tag>/{
      x;s/.//;/./!q;x; # remove a token and quit if hold space empty
    }
  }' file.xml

つまり、スペアスペース表示する残りのカウンタで(ドット文字を使用)

おすすめ記事