Estou mantendo um driver Linux e quero substituir todos os% p do driver por% pK. Para fazer isso usei o seguinte comando.
grep "%p[^K]" -Rl . | xargs sed -i 's/%p[^K]/%pK/g'
Ele falha no caso abaixo.
%p-%p --> %pK%pK (hyphen is removed)
Por favor, sugira uma expressão regular adequada para que o comando sed funcione.
Responder1
A substituição sed na pergunta removeria todos os caracteres após a %p
, não apenas traços, já que [^K]
faz parte da string correspondente. Você pode contornar isso capturando o caractere depois %p
com parênteses (escapados) e colocando-o de volta com \1
. Em sed
:
$ echo '%p %p %pK' | sed 's/%p\([^K]\)/%pK\1/g'
%pK %pK %pK
Embora você possa querer usar [^a-zA-Z]
ou similar apenas no caso de usar outros modificadores para %p
.
Responder2
Seguir o comando fez mágica para mim
for fname in $(grep "%p[^K]" -Rl .); do perl -pi -e 's/%p(?!K)/%pK/g' $fname; done
Obrigado Sundeep, seu comentário ajudou muito. :)