終了文字列が開始文字列とは異なるファイルから行を抽出しようとしています。
次の形式の入力ファイルがあります。
<item_id>6</item_id>
<info1>abc</info1>
<info2>123</info2>
<item_id>6</item_id>
<info1>def</info1>
<info2>456</info2>
<item_id>6</item_id>
<info1>ghi</info1>
<info2>789</info2>
<item_id>9</item_id>
<info1>jkl</info1>
<info2>012</info2>
<item_id>9</item_id>
<info1>mno</info1>
<info2>345</info2>
「6」から「9」まで抽出したい(9はランダムな数字です)
始まりは<item_id>6<\item_id>
終わりは<item_id>X<\item_id>
6ではありません
予想される結果:
<item_id>6</item_id>
<info1>abc</info1>
<info2>123</info2>
<item_id>6</item_id>
<info1>def</info1>
<info2>456</info2>
<item_id>6</item_id>
<info1>ghi</info1>
<info2>789</info2>
私は試した:
sed -n "/<item_id>6<\/item_id>/,/<item_id>!6<\/item_id>/p" input.file > output.6
sed -n "/<item_id>6<\/item_id>/,/<item_id>\!6<\/item_id>/p" input.file > output.6
sed -n "/<item_id>6<\/item_id>/,/<item_id>\{!6}<\/item_id>/p" input.file > output.6
sed -n "/<item_id>6<\/item_id>/,/<item_id>(6)\@!.<\/item_id>/p" input.file > output.6
sed -n "/<item_id>6<\/item_id>/,/<item_id>! 6<\/item_id>/p" input.file > output.6
ベストアンサー1
これが正しい形式のXML文書であると仮定し、XMLStarletを使用してinfo_id
値のあるノードを選択し、兄弟ノードと6
それに続くノードを選択します。info1
info2
$ xmlstarlet sel -t -m '//item_id[. = 6]' \
-c . -nl \
-c './following-sibling::info1[1]' -nl \
-c './following-sibling::info2[1]' -nl file.xml
<item_id>6</item_id>
<info1>abc</info1>
<info2>123</info2>
<item_id>6</item_id>
<info1>def</info1>
<info2>456</info2>
<item_id>6</item_id>
<info1>ghi</info1>
<info2>789</info2>
または、次のノードの名前を無視してください。
xmlstarlet sel -t -m '//item_id[. = 6]' \
-c . -nl \
-c './following-sibling::*[1]' -nl \
-c './following-sibling::*[2]' -nl file.xml