大きな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
つまり、スペアスペース表示する残りのカウンタで(ドット文字を使用)