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.