#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>$
l
ookを使用すると、いつでもパターンスペースを印刷できます。その後、\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
スクリプトを書く方法です。