procura e substitui usando grep (não sed)

0

Eu tenho lido sobre sed e descobri que ele foi desenvolvido a partir do comando grep .

De acordo com o link ,

First appearing in Version 7 Unix, sed is one of the early Unix commands built for command line processing of data files. It evolved as the natural successor to the popular grep command. The original motivation was an analogue of grep (g/re/p) for substitution, hence "g/re/s".

Sed procura e substitui

sed 's/old/new/' Example.txt

Assim, eu queria saber se grep pode executar a função de pesquisa e substituição, como sed .

Se isso for possível, por favor, deixe-me saber como realizar o mesmo via grep , e não via sed .

    
por Charlotte Russell 26.06.2017 / 12:51

2 respostas

5

grep destina-se apenas a (e foi apenas inicialmente) imprimir (ing) as linhas correspondentes a um padrão. Isso é o que o grep significa (com base no comando g/re/p ed ).

Agora, algumas implementações grep adicionaram alguns recursos que interferem um pouco na função de outros comandos. Por exemplo, alguns têm -r / --include / --exclude para executar parte do trabalho de find .

O GNU grep adicionou uma opção -o que faz com que ele execute partes do trabalho de sed , pois ele edita as linhas que estão sendo correspondidas.

pcregrep estendeu com -o1 , -o2 ... para imprimir o que foi correspondido pelos grupos de captura. Então, com essa implementação, mesmo que ela não tenha sido projetada para isso, você pode substituir:

sed 's/old/new/'

com:

pcregrep --om-separator=new  -o1 -o2 '(.*?)old(.*)'

Isso não funciona corretamente, no entanto, se os grupos de captura corresponderem à sequência vazia. Em uma entrada como:

XoldY
Xold
oldY

dá:

XnewY
X
Y

Você poderia contornar isso usando truques ainda mais desagradáveis como:

PCREGREP_COLOR= pcregrep --color=always '.*old.*' |
  pcregrep --om-separator=new -o1 -o2 '^..(.+?)old(.+)..' |
  pcregrep -o1 '.(.*).'

Ou seja, prefixar e anexar \e[m (sequência de escape de coloração) a todas as linhas correspondentes para ter certeza de que há pelo menos um caractere em cada lado de old e removê-las depois.

    
por 26.06.2017 / 14:35
2

Não, o grep não pôde executar substituições (em uma chamada), por isso houve uma necessidade clara de sed (e mais tarde awk como uma linguagem melhor para processamento de texto).

    
por 26.06.2017 / 13:22

Tags