Para ser mais preciso
Some text
begin
Some text goes here.
end
Some more text
e eu quero extrair um bloco inteiro que começa de "begin" até "end".
com awk podemos fazer o mesmo awk '/begin/,/end/' text
.
Como fazer com grep?
Para ser mais preciso
Some text
begin
Some text goes here.
end
Some more text
e eu quero extrair um bloco inteiro que começa de "begin" até "end".
com awk podemos fazer o mesmo awk '/begin/,/end/' text
.
Como fazer com grep?
Respostas:
Atualizado 18 de novembro de 2016 (como o comportamento do grep foi alterado: o parâmetro grep com -P agora não suporta
^
e$
ancora [no Ubuntu 16.04 com kernel v: 4.4.0-21-generic]) ( correção incorreta (não) )nota: para outros comandos, substitua as âncoras '^' e '$' pela âncora de nova linha
'\n'
______________________________Com o comando grep:
Se você quiser não incluir os padrões "begin" e "end" no resultado, use grep com o suporte Lookbehind e Lookahead.
Além disso, você pode usar a
\K
notificação notificar, em vez da asserção Lookbehind.\K
A opção ignora tudo antes da correspondência de padrões e ignora o próprio padrão.\n
usado para evitar a impressão de linhas vazias na saída.Ou como @AvinashRaj sugere que há grep fácil e simples como a seguir:
(?s)
diz ao grep para permitir que o ponto corresponda a caracteres de nova linha.[\s\S]
corresponde a qualquer caractere que seja espaço em branco ou não em branco.E a saída deles sem incluir "begin" e "end" é a seguinte:
veja aqui o teste completo de todos os comandos ( fora de datado, pois o comportamento grep com o parâmetro -P é alterado )
Nota:
^
aponte o início de uma linha e$
aponte o final de uma linha. estes foram adicionados ao redor de "begin" e "end" para combiná-los se estiverem sozinhos em uma linha.Em dois comandos, escapei
$
porque ele também usava para "Substituição de Comando" ($(command)
) que permite que a saída de um comando substitua o nome do comando.Do man grep:
fonte
grep -Pzo "(?<=begin\n)(.|\n)*(?=\nend)" file
para não imprimir o\n
caractere existente na linha de início.grep -Pzo "(?s)begin.*?end" file
grep -Pzo "begin[\s\S]*?end" file
grep: ein nicht geschütztes ^ oder $ wird mit -Pz nicht unterstützt
A tradução do erro é algo como:grep: a not protected ^ or $ is not supported with -Pz
grep
parece ter mudado.Caso você
grep
não suporte a sintaxe perl (-P
), você pode tentar unir as linhas, corresponder ao padrão e expandir as linhas novamente, como abaixo:fonte