Para obter a saída exibida, você pode executar
grep -Po 'abc \K.*(?= cde)' file.txt > outfile.txt
O P
ativa Expressões regulares compatíveis com Perl que têm suporte para lookarounds e \K
, o que significa " descartar qualquer coisa correspondida até este ponto ". O -o
faz com que grep
imprima apenas a parte correspondida da linha. Assim, combinada com a antecipação positiva ( ?=cde
) e a \K
, será impressa apenas os caracteres entre abc
e cde
. O > outfile.txt
salvará o resultado no arquivo outfile.txt
.
Algumas outras abordagens:
-
sed
sed -r 's/.*abc (.+) cde.*//' file.txt > outfile.txt
Aqui, os parênteses capturam o padrão e você pode se referir a ele como
. O
's/source/replacement/'
é o operador de substituição e substituisource
porreplacement
. Neste caso, ele simplesmente excluirá tudo, exceto o que estiver entreabc
ecde
. -
perl
perl -pe 's/.*abc (.+) cde.*/$1/' file.txt > outfile.txt
O mesmo que acima, o
-p
significa "leia o arquivo de entrada linha a linha, aplique o script dado como-e
e imprima. -
awk
awk -F'abc|cde' '{print $2}' file.txt > outfile.txt
A ideia aqui é definir os delimitadores de campo como
abc
oucde
. Supondo que essas seqüências são exclusivas em cada linha, o segundo campo será o único entre os dois. Isso, no entanto, inclui espaços iniciais e finais, para removê-los e passar por outroawk
:awk -F'abc|cde' '{print $2}' file | awk '{print $1}'
-
GNU
awk
(gawk
). O acima funciona perfeitamente emgawk
, estou incluindo isso caso você queira fazer algo mais complexo e precisar capturar padrões.gawk '{print gensub(/.*abc (.*) cde.*/,"\1", "g",$0);}' file.txt > outfile.txt
Esta é a mesma ideia básica dos
perl
esed
, mas usando o .