Buscar y reemplazar no respeta mi token "$1"

Buscar y reemplazar no respeta mi token "$1"

Usando bash shell en Ubuntu 14.04. Intentando hacer una búsqueda simple y reemplazar en cada línea de un archivo. Yo he tratado

perl -pi -e "s/.*/DELETE FROM my_object_times where ID = '$1';/g" ids.csv

pero esto me deja con un archivo lleno de

DELETE FROM my_object_times where ID = '';

y todo lo que quería capturar no se inserta en absoluto. ¿Cuál es una mejor manera de hacer esta búsqueda y reemplazo? Esperaba que los resultados finales fueran algo así como

DELETE FROM my_object_times where ID = 'abcdef12341234abcdef';

Respuesta1

perl -pi -e "s/.*/DELETE FROM my_object_times where ID = '$1';/g" ids.csv

Dado que el fragmento de Perl está entre comillas dobles, el shell se expandirá $1a cualquiera que sea su valor actual (probablemente vacío o sin configurar en su caso). Debes escapar del signo de dólar para evitarlo. Además, no tiene un grupo de captura en el patrón del s///operador, por lo que $1no contendría nada. ( perl -wo use warningsle advertiría sobre esto).

Agregue paréntesis al patrón o use $&. Además, el reemplazo global no parece funcionar bien con un patrón que puede tener ancho cero, por lo que sugeriría eliminar el gindicador -.

Entonces:

perl -w -pe "s/.*/DELETE FROM my_object_times where ID = '\$&';/" 

(Aunque &no es una variable válida en Shell, se $&dejará como está. Pero, en general, $sería necesario escapar de ella).

Por lo general, sería mejor poner el código Perl entre comillas simples, ya que el signo de dólar es bastante común en Perl. Pero aquí las comillas simples dentro del código Perl lo hacen un poco difícil. Una opción es presentarlos en hexadecimal:

perl -w -pe 's/.*/DELETE FROM my_object_times where ID = \x27$&\x27;/' 

Respuesta2

Esto lo hará:

sed -i "s/.*/DELETE FROM my_object_times where ID = '&';/" ids.csv

información relacionada