sed -n '/Event1/,/Event2/H;/Event2/{x;/B/p}' filename
Explicação:
- o programa sed tem duas partes:
/Event1/,/Event2/H
e/Event2/{x;/B/p}
. - Primeira parte:
/Event1/,/Event2/
corresponde a todas as linhas entreEvent1
eEvent2
inclusive. oH
coloca 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:
x
e/B/p
. -
x
tira tudo de "espaço de espera" e coloca em "espaço de padrão". -
/B/p
imprime 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