imprime linhas entre início e fim usando sed

6

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'
    
por Miserable Variable 06.06.2013 / 17:55

4 respostas

10
sed -n -e '/^BEGIN$/,/^END$/{/^BEGIN$/d;/^END$/d;p;}' input
    
por 06.06.2013 / 18:22
4

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

    
por 06.06.2013 / 19:06
1

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
    
por 06.06.2013 / 18:31
-1

Como alternativa, para incluir os delimitadores, você pode fazer sed -ne "/BEGIN/,/END/{p;}" $INPUT

    
por 24.08.2017 / 02:37

Tags