El comando SED no reemplaza (expresión regular funcional)

El comando SED no reemplaza (expresión regular funcional)

Estoy intentando reemplazar en uno de mis proyectos todosmysql a mysqli, con sus parámetros. Para hacerlo, busco todos los archivos con mysql en mi carpeta de forma recursiva y los reemplazo con mysqli.

Ex:

mysql_query($consulta) a mysqli_query($enlace, $consulta)

Puedo capturar todo (según el evaluador de Regex), pero nada pareció ser reemplazado y tampoco hubo errores.

grep -rl mysql PROJECTFILE | xargs sed -ri "s/(mysql_query)\(\$([\w-]+)\)/WhatIWant/g"

He leído sobre barras invertidas ensedpero no lo entendí del todo; la salida no tiene errores pero el archivo sigue siendo el mismo. Si solo pudiera saber lo que falta con un ejemplo o explicación, sería perfecto.

Es fácil reemplazar mysql por mysqli, pero sería bueno hacerlo todo a la vez. Estoy usando un archivo temporal solo para asegurarme de que funcione antes de poder probarlo en mi proyecto.

Gracias.

EDITAR: Sé que si quiero hacerlo todo de una vez tengo que capturarMySQLpor sí solo y agregar uni, pero eso fue sólo un pensamiento.


Para tedron, el resultado deseado sería similar a este.

sed -ri "s/(mysql_query)\(\$([\w-]+)\)/mysqli_query($link, \2)/g" filename

Glenn sugirió una solución sin captura. Sin embargo, si quiero modificarmysql_fetch_array($consulta), entonces es posible que tenga que usar expresiones regulares para mantener el primer parámetro y agregarloMYSQLI_BOTHPor ejemplo.


SOLUCIÓN:

Gracias a tedron, pude resolver mi problema a mi manera:

sed -ri 's/(mysql)_query\((\$[a-zA-Z_-]+)\)/\1i_query($link, \2)/' filename

Y para mysqli_fetch_array:

sed -ri 's/(mysql)(_fetch_array)\((\$[a-zA-Z_-]+)\)/\1i\2(\3, MYSQLI_BOTH)/' filename

Use esto grepcomo lo hice en mi pregunta para modificar un directorio a la vez.

Respuesta1

No necesitas capturar nada:

sed 's/mysql_query(/mysqli_query($link, /g' file

No lo use -imientras realiza la prueba, agréguelo cuando esté satisfecho con los resultados.

Respuesta2

Otra posibilidad más utilizando expresiones regulares extendidas ( -r):

sed -r 's/(mysql)(_query\()/\1i\2$link,/g'

Respuesta3

No necesita un grupo de captura mysql_query, porque no lo copiará en el reemplazo. Sólo necesitas capturar el argumento de la consulta, ya que varía en cada llamada.

sed -ri 's/mysql_query\s*\((\$\w+)\)/mysqli_query($link, \1)/g'

Respuesta4

El problema es el \w. Solo descubrí esto cuando intenté descubrir qué está pasando aquí, pero aparentemente, cosas como \so \wque ya son clases de caracteres no se pueden usar dentro de otras clases de caracteres con ERE (pueden hacerlo con PCRE). Para ilustrar:

$ echo foo- | sed -r 's/[\w-]+/bar/'
foobar
$ echo 'w\-foo' | sed -r 's/[\w-]+/bar/'
barfoo
$ echo foo- | sed -r 's/\w+/bar/'
bar-

Por lo tanto, las clases de escape de caracteres se tratan como caracteres literales cuando están dentro de una [ ]clase de caracteres. La expresión [\w-]significa "coincidir con cualquiera de \, wo -.

Para que su expresión regular funcione, use [a-zA-z_]en lugar de \wo use paréntesis de agrupación:

$ echo 'mysql_query($query)' | 
    sed -r 's/mysql_query\(\$(\w|-)+\)/WhatIWant/'
WhatIWant

Específicamente para su ejemplo:

$ echo 'mysql_query($query)' | 
    sed -r 's/(mysql_query)\((\$[a-zA-Z_-]+)\)/\1($link,\2)/'
mysql_query($link,$query)

información relacionada