sed を使用した開始と終了の間の行の印刷

sed を使用した開始と終了の間の行の印刷

2つの区切り記号の間に行を印刷する必要があります。例えば、入力が与えられると

fluff1
fluff2
BEGIN
good3
good4
END
fluff5
fluff6
BEGIN
good7
good8
END
more fluff

私が望む出力は

good3
good4
good7
good8

私はそれを使用する方法を知っていますが、awkより短い解決策を探したいと思いますsed

次のようになりますが、これはもちろん間違った構文です。

sed -n '/BEGIN/+1,/END/-1p'

答え1

sed -n -e '/^BEGIN$/,/^END$/{/^BEGIN$/d;/^END$/d;p;}' input

答え2

GNU sed3.95以降では、次のことができます。

sed '/^BEGIN$/,/^END$/!d;//d'

それ以外の場合は、sed次のように書く必要があります。

sed '/^BEGIN$/,/^END$/!d;//d;/^BEGIN$/d'

でも

sed '/^BEGIN$/,/^END$/!d;/^END$/d;/^BEGIN$/d'

ビジーボックスと同じですsed

また見てくださいsed FAQ

答え3

区切り文字を繰り返さない場合は、Perl を使用できます。

perl -ne '/BEGIN/ && do {$a=1; next}; $a=0 if /END/; print if $a' input

HaukeLagingを変更することもできます。回答変数の使用:

b="BEGIN"; e="END"; sed -n -e "/^$b$/,/^$e$/{/^$b$/d;/^$e$/d;p}" input

答え4

または、区切り文字を含めるには、次のようにします。sed -ne "/BEGIN/,/END/{p;}" $INPUT

関連情報