grep
, que é g/re/p
, é uma ferramenta básica para p alterar as linhas que correspondem a uma xpressão egb e .
Você quer mais aqui, como um s tream ed ou:
sed '/^begin$/,/^end$/!d'
ou uma ferramenta de processamento de texto mais geral com uma linguagem avançada como awk
, perl
... como você já descobriu.
Dito isto, algumas implementações grep
podem ir um pouco mais longe.
pcregrep -M '(?s)^begin$.*?^end$'
Isso está usando o modo multi-line ( -M
); (?s)
alterna o sinalizador s
no regexp do PCRE, de forma que .
também corresponda aos caracteres da nova linha.
Com a versão atual de pcregrep
, não é garantido que funcione se begin
e end
forem mais do que 20kiB separados (ou o tamanho do buffer especificado).
Por exemplo, será igual a
(seq 12091; echo begin; seq 4315; echo end; seq 10) |
pcregrep -M '(?s)^begin$.*?^end$'
Mas não em:
(seq 12091; echo begin; seq 4316; echo end; seq 10) |
pcregrep -M '(?s)^begin$.*?^end$'
Ou com o GNU grep
construído com suporte a PCRE e assumindo que o arquivo não contenha caracteres NUL:
grep -zoP '(?s)^begin$.*?^end$'
No entanto, isso significa que grep
carregará o arquivo inteiro na memória antes de iniciar a pesquisa, portanto, não deve ser usado, exceto para arquivos pequenos.
De qualquer forma, grep
não é o caminho certo para ir até aqui.