Estoy manteniendo un controlador de Linux y quiero reemplazar todo %p en el controlador con %pK. Para hacer esto utilicé el siguiente comando.
grep "%p[^K]" -Rl . | xargs sed -i 's/%p[^K]/%pK/g'
Falla en el siguiente caso.
%p-%p --> %pK%pK (hyphen is removed)
Sugiera una expresión regular adecuada para que funcione el comando sed.
Respuesta1
El reemplazo de sed en la pregunta eliminaría cualquier carácter después de %p
, no solo guiones, ya que [^K]
es parte de la cadena coincidente. Puede solucionar este problema capturando el carácter que aparece después %p
con un paréntesis (escapado) y volviéndolo a colocar con \1
. En sed
:
$ echo '%p %p %pK' | sed 's/%p\([^K]\)/%pK\1/g'
%pK %pK %pK
Aunque es posible que quieras usar [^a-zA-Z]
o similar en caso de que uses otros modificadores para %p
.
Respuesta2
Seguir el comando hizo magia para mí.
for fname in $(grep "%p[^K]" -Rl .); do perl -pi -e 's/%p(?!K)/%pK/g' $fname; done
Gracias Sundeep, tu comentario ayudó mucho. :)