Correspondência de padrões e grep juntos [duplicado]

1

Eu tenho um arquivo como abaixo

Event1
A
B
C
Event2
CC
CC
DD
Event1
E
N
D
Event2 

Agora eu poderia sed entre o Evento 1 e o Evento 2 e conseguir todas as linhas entre eles, mas o que eu quero é, se o Sed puder gerar somente se as linhas entre Event1 e Event2 tiverem "B" como conteúdo. Então minha saída parece

Event1
A
B
C
Event2
    
por Senthil 04.01.2017 / 09:30

1 resposta

4
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 entre Event1 e Event2 inclusive. o H coloca todas essas linhas no chamado "espaço de espera".
  • Segunda parte: /Event2/{x;/B/p} se a linha contiver Event2 , 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 um B .

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

por 04.01.2017 / 10:24

Tags