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:
-
sedsed -r 's/.*abc (.+) cde.*//' file.txt > outfile.txtAqui, 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 substituisourceporreplacement. Neste caso, ele simplesmente excluirá tudo, exceto o que estiver entreabcecde. -
perlperl -pe 's/.*abc (.+) cde.*/$1/' file.txt > outfile.txtO mesmo que acima, o
-psignifica "leia o arquivo de entrada linha a linha, aplique o script dado como-ee imprima. -
awkawk -F'abc|cde' '{print $2}' file.txt > outfile.txtA ideia aqui é definir os delimitadores de campo como
abcoucde. 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.txtEsta é a mesma ideia básica dos
perlesed, mas usando o .