私は(sedのウェブサイトhttp://sed.sourceforge.net/sed1line.txtから)このワンライナーを持っています:
sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;/BBB/!d;/CCC/!d'
その目的は、AAA、BBB、またはCCCのいずれかを段落で検索することです。
スクリプトについての私の理解:
- '/./'は、空ではないすべての行に一致します
- '{}'括弧内のすべてのコマンドは、一致した行を処理します
- 「H」は、一致した行でホールドスペースを追加します
- '$!d'は、パターンスペースから最後の行以外のすべてを削除します
- 'x'はパターンスペースとホールドスペースを交換します
- '/ AAA /!d' AAA段落を検索し、印刷します
私には明らかではないこと:
- ホールドスペースには(段落ごとに)いくつかの別々の行が必要ですが、なぜ段落全体を検索できるのですか?ホールドスペースの行は1行にマージされていますか?
- そして、sedは、ホールドスペースで1つの段落が終了し、もう1つの段落がいつ開始するかをどのように知るのでしょうか。
- なぜ「$!d」を追加する必要があるのですか、なぜ「$ d」では不十分なのですか?この場合、「-n」を省略して「$!d」の代わりに「$ p」を使用できないのはなぜですか?
コメントありがとうございます!
私のテストデータ(すべての段落にXXが含まれているものと一致します):
YYaaaa
aaa1
aaa2
aXX3
aaa4
YYbbbb
bbb1
bbb2
YYcccc
ccc1
ccc2
ccc3
cXX4
ccc5
YYdddd
ddd1
dXX2
次のコマンドが使用されます。
sed -ne '/./{H;$!d};x;/XX/p' test2
バージョン:
$ sed --version
GNU sed-Version 4.2.1
$ bash --version
GNU bash, Version 4.2.10(1)-release (x86_64-pc-linux-gnu)