Buscar y reemplazar cadena en Vim

1

Tengo un código similar a este:

$ POST _ ['%']

donde% es cualquier longitud de cualquier letra + cadena de números y quiero reemplazarlo con

mysql_real_escape_string($POST['%'])

hasta ahora he creado este comando pero no reconoce $ POST ['.'] como ninguna cadena.

:%s/$_POST['.']/mysql_escape_string($_POST['\=submatch(0)'])/gc
James
fuente

Respuestas:

2

Primero, su uso de \=submatch(0)es demasiado complejo, solo use \ 0. Y tenga en cuenta que la coincidencia secundaria 0 siempre es el patrón totalmente coincidente, por lo que su patrón de reemplazo tiene cierta redundancia. En segundo lugar, el .átomo solo coincide con un personaje. Y finalmente, necesitas escapar del []'s y el $. Intenta esto en su lugar:

:%s/\$_POST\['.\{-}'\]/mysql_escape_string(\0)/gc

El uso de \{-}medios para hacer coincidir cualquier número del átomo anterior, de una manera no codiciosa (en oposición a *).

También noto que sus ejemplos son inconsistentes entre sí. ¿Es " $POST_[...]", " $_POST[...]" o simplemente " $POST[...]"?

Es posible que desee echar un vistazo a un libro como Mastering Regular Expressions .

Heptita
fuente
2

$, [y] son ​​metacaracteres en expresiones regulares. Prueba esto (no probado)

:%s/\$_POST\['.'\]/mysql_escape_string(\$_POST\['\=submatch(0)'\])/gc

[editar] Gracias @tink

Chris Nava
fuente
Patrón no encontrado: $ _POST ['.']
James
En realidad ... $ también es un carácter especial, así que intente esto:% s / \ $ POST _ ['.'] / Mysql_escape_string ($ _ POST ['\ = submatch (0)']) / gc
tink
1
s /^\(.*\)$/ mysql_real_escape_string (\ 1) /

Parece hacer lo que quieres. Es simple ya que solo agrega texto alrededor de la cadena existente en lugar de reemplazar realmente las cosas dentro de ella.

John
fuente
No puedo reelaborar su publicación para simplemente reemplazar $ POST [''], el cajero automático solo reemplaza todas las líneas con 'mysql_real_escape_string (1)'
James
Intenté algo como esto:% s / $ POST ['^ (. *) $'] / Mysql_real_escape_string (\ 1) / g
James
Nuestros vim deben registrar los refref de manera diferente, entonces ... Si nada más, puede reemplazar ^ y $ en dos ejecuciones de reemplazo.
John
0

8 meses después y necesito esto nuevamente, así que pensé en proporcionar una solución ordenada:

sed 's/\$_GET\[\(.*\)\]/mysqli_real_escape_string(\$_GET\[\1\])/g' test.php
James
fuente