Como faço para grep para múltiplos padrões em múltiplas linhas?

11

Para ser preciso

Some text
begin
Some text goes here.
end
Some more text

e eu quero extrair todo o bloco que começa de "begin" até "end".

com o awk, podemos fazer como awk '/begin/,/end/' text .

Como fazer com o grep?

    
por Iker 19.11.2014 / 10:35

2 respostas

13

Atualizado em 18-Nov-2016 (pois o comportamento do grep é alterado: grep com o parâmetro -P agora não suporta ^ e $ anchors [no Ubuntu 16.04 com kernel v: 4.4 .0-21-generic]) (correção errada (não)

$ grep -Pzo "begin(.|\n)*\nend" file
begin
Some text goes here.  
end

nota: para outros comandos, basta substituir o '^' & amp; Âncoras '$' com âncora de nova linha '\n'

por αғsнιη 19.11.2014 / 11:17
2

Caso o grep não suporte a sintaxe perl ( -P ), você pode tentar unir as linhas, combinando com o padrão e expandindo as linhas novamente, conforme abaixo:

$ tr '\n' , < foo.txt | grep -o "begin.*end" | tr , '\n'
begin
Some text goes here.
end
    
por kenorb 21.12.2015 / 22:41