sed -n '/Event1/,/Event2/H;/Event2/{x;/B/p}' filename
Explicação:
- o programa sed tem duas partes:
/Event1/,/Event2/He/Event2/{x;/B/p}. - Primeira parte:
/Event1/,/Event2/corresponde a todas as linhas entreEvent1eEvent2inclusive. oHcoloca todas essas linhas no chamado "espaço de espera". - Segunda parte:
/Event2/{x;/B/p}se a linha contiverEvent2, em seguida, execute o grupo de comandos{x;/B/p}. - O grupo de comandos também tem duas partes:
xe/B/p. -
xtira tudo de "espaço de espera" e coloca em "espaço de padrão". -
/B/pimprime o espaço de padrão se houver umB.
A ideia em linguagem humana: anote todas as linhas entre Event1 e Event2 . Se você vir Event2 , observe todas as linhas que acabou de notar. Se houver um B , imprima. Caso contrário, ignore.
Observe que o programa sed acima tem um "bug".
Se a entrada for assim:
Event1x
A
B
C
Event2x
CC
CC
DD
Event1y
E
N
D
Event2y
CC
CC
DD
Event1z
X
B
X
Event2z
A saída ficará assim:
$ sed -n '/Event1/,/Event2/H;/Event2/{x;/B/p}' foo
Event1x
A
B
C
Event2x
Event2y
Event1z
X
B
X
Event2z
Observe o Event2y e também a primeira linha vazia. Isso é por causa das peculiaridades do sed.
Esta modificação do programa sed substitui o Event2y por uma linha vazia. que é basicamente a mesma razão para a primeira linha vazia.
sed -n '/Event1/,/Event2/H;/Event2/{s/.*//;x;/B/p}' filename
Exemplo de saída
$ sed -n '/Event1/,/Event2/H;/Event2/{s/.*//;x;/B/p}' filename
Event1x
A
B
C
Event2x
Event1z
X
B
X
Event2z
A linha vazia pode ser corrigida com ainda mais sed-fu, mas precisarei de mais pontos de reputação para envolver minha mente em torno disso.
Saiba mais sed !! 1