.png)
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 grep
como 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 -i
mientras 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 \s
o \w
que 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 \
, w
o -
.
Para que su expresión regular funcione, use [a-zA-z_]
en lugar de \w
o 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)