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.