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 sed
3.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