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á $1
a 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 $1
no contendría nada. ( perl -w
o use warnings
le 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 g
indicador -.
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