Reemplace %p con %pK en el código del kernel de Linux

Reemplace %p con %pK en el código del kernel de Linux

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 %pcon 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. :)

información relacionada