sed -n -e '/^BEGIN$/,/^END$/{/^BEGIN$/d;/^END$/d;p;}' input
Eu preciso imprimir as linhas entre dois delimitadores. Por exemplo, dada a entrada
fluff1
fluff2
BEGIN
good3
good4
END
fluff5
fluff6
BEGIN
good7
good8
END
more fluff
Eu quero que a saída seja
good3
good4
good7
good8
Eu sei como fazer isso com awk
, mas espero encontrar uma solução mais curta com sed
.
O que eu gostaria que fosse é o seguinte, mas é claro que é uma sintaxe inválida:
sed -n '/BEGIN/+1,/END/-1p'
Com o% GNUsed
3,95 ou acima, você pode fazer:
sed '/^BEGIN$/,/^END$/!d;//d'
Com outros sed
s, talvez seja necessário escrevê-lo:
sed '/^BEGIN$/,/^END$/!d;//d;/^BEGIN$/d'
Ou até mesmo
sed '/^BEGIN$/,/^END$/!d;/^END$/d;/^BEGIN$/d'
como com busybox sed
.
Veja também as perguntas frequentes sobre sed
Se você não quiser repetir os delimitadores, use Perl:
perl -ne '/BEGIN/ && do {$a=1; next}; $a=0 if /END/; print if $a' input
Você também pode modificar a resposta do HaukeLaging para usar variáveis:
b="BEGIN"; e="END"; sed -n -e "/^$b$/,/^$e$/{/^$b$/d;/^$e$/d;p}" input
Como alternativa, para incluir os delimitadores, você pode fazer sed -ne "/BEGIN/,/END/{p;}" $INPUT
Tags sed