#begin command block
#append all lines between two addresses to hold space
sed -n -f - <<\SCRIPT file.xml
\|<tag1>|,\|</tag1>|{ H
#at last line of search block exchange hold and pattern space
\|</tag1>|{ x
#if not conditional ; clear buffer ; branch to script end
\|<tag2>[^<]*foo[^\n]*</tag2>|!{s/.*//;h;b}
#do work ; print result; clear buffer ; close blocks
s?*?*?;p;s/.*//;h;b}}
SCRIPT
上記を行う場合、表示するデータを考慮して、その最後のクリーンアップ行の前に、sed次のようなパターンスペースで作業する必要があります。
^\n<tag1>\n<tag2>foo</tag2>\n</tag1>$
lookを使用すると、いつでもパターンスペースを印刷できます。その後、\nキャラクターをアドレス指定できます。
sed l <file
呼び出さsedれた段階で各行が処理することを示しますl。
だから私はそれをテストしたところ、最初の行の\backslash後にもう1つ必要です,commaが、それ以外はそのまま動作します。ここでそれをに入れて、_sed_functionこの回答全体でデモンストレーションの目的で簡単に呼び出すことができるようにします(コメントを含めて機能しますが、簡潔にするためにここでは削除されています)。
_sed_function() { sed -n -f /dev/fd/3
} 3<<\SCRIPT <<\FILE
\|<tag1>|,\|</tag1>|{ H
\|</tag1>|{ x
\|<tag2>[^<]*foo[^\n]*</tag2>|!{s/.*//;h;b}
s?*?*?;p;s/.*//;h;b}}
#END
SCRIPT
<tag1>
<tag2>bar</tag2>
</tag1>
<tag1>
<tag2>foo</tag2>
</tag1>
FILE
_sed_function
#OUTPUT#
<tag1>
<tag2>foo</tag2>
</tag1>
では、pをに切り替えてl、スクリプトの開発中に何を処理しているかを確認し、non-opデモを削除しs?て、最後の行がsed 3<<\SCRIPT次のようになるようにします。
l;s/.*//;h;b}}
次に、もう一度実行します。
_sed_function
#OUTPUT#
\n<tag1>\n <tag2>foo</tag2>\n</tag1>$
OK!だから私は正しかった-それは良い感じです。それでは、lフックを入れ替えて削除する行を見てみましょう。電流lを削除して1をに追加して、!{block}次のようにします。
!{l;s/.*//;h;b}
_sed_function
#OUTPUT#
\n<tag1>\n <tag2>bar</tag2>\n</tag1>$
完全に消去する直前の状態です。
最後にもう1つお見せしたいのは、H私たちが構築する古いスペースです。いくつかの重要な概念について説明します。したがって、最後のlフックを再度削除し、最初の行を変更して、最後にH古いスペースをのぞくように追加します。
{ H ; x ; l ; x
_sed_function
#OUTPUT#
\n<tag1>$
\n<tag1>\n <tag2>bar</tag2>$
\n<tag1>\n <tag2>bar</tag2>\n</tag1>$
\n<tag1>$
\n<tag1>\n <tag2>foo</tag2>$
\n<tag1>\n <tag2>foo</tag2>\n</tag1>$
H古いスペースはラインサイクルを生き延びます-したがって、その名前。それで、人々がよくつまずくのは-わかりました、私がつまずくのは-それを使った後で削除する必要があるということです。IのみEこの場合にx変更すると、保持空間が非常になるパターンスペースおよびその逆、この変化はまた、ラインサイクルに耐えます。
その結果、以前はパターンスペースであったホールドスペースを削除する必要があります。まず、現在のパターンスペースを次のようにクリアします。
s/.*//
これは単にすべての文字を選択して削除するだけです。d現在の行サイクルが終了し、次のコマンドが完了せず、スクリプトがかなり無駄になるため、使用できません。
h
同様にこれは作品Hが、それは上書きされ、私はちょうどそれを効果的に削除する、私のホールドスペースの上に私の空白のパターンスペースをコピーしたので、ホールドスペースを。今私はちょうどできます:
b
アウト。
そして、それが私がsedスクリプトを書く方法です。