Hace unos días tuve la necesidad de reemplazar, en un archivo de texto, todas las apariciones de una cadena por el número de la línea en la que se encuentra. Afortunadamente encontré la solución utilizando un comando en perl
.
Supongamos que tengo el siguiente archivo de texto:
insert into usuarios (id,nombre) values (,"Bart"); insert into usuarios (id,nombre) values (,"Lisa"); insert into usuarios (id,nombre) values (,"Homero"); insert into usuarios (id,nombre) values (,"Marge"); insert into usuarios (id,nombre) values (,"Maggie");
En el cual deseo reemplazar cada aparición de la cadena (,
por (i,
, donde i
corresponde con el número de línea.
Evidentemente se trata de un conjunto de sentencias en lenguaje SQL, donde mi intención es generar automáticamente los identificadores de usuario para la columna "id".
Para realizar esta tarea, es posible recurrir a una sustitución en perl
:
perl -pe '$i++; s{\(,}{\($i,}' < archivo_entrada.txt > archivo_salida.txt
Veamos un ejemplo:
root@devuan:~# cat usuarios.txt insert into usuarios (id,nombre) values (,"Bart"); insert into usuarios (id,nombre) values (,"Lisa"); insert into usuarios (id,nombre) values (,"Homero"); insert into usuarios (id,nombre) values (,"Marge"); insert into usuarios (id,nombre) values (,"Maggie"); root@devuan:~# perl -pe '$i++; s{\(,}{\($i,}' < usuarios.txt > usuarios.sql root@devuan:~# cat usuarios.sql insert into usuarios (id,nombre) values (1,"Bart"); insert into usuarios (id,nombre) values (2,"Lisa"); insert into usuarios (id,nombre) values (3,"Homero"); insert into usuarios (id,nombre) values (4,"Marge"); insert into usuarios (id,nombre) values (5,"Maggie");
Notar cómo es necesario escapar los caracteres especiales dentro de la sustitución utilizando barras invertidas (backslash \
). Además, tener en cuenta que no se deben dejar líneas en blanco, pues cada línea incremente el contador i
:
root@devuan:~# cat usuarios.txt insert into usuarios (id,nombre) values (,"Bart"); insert into usuarios (id,nombre) values (,"Lisa"); insert into usuarios (id,nombre) values (,"Homero"); insert into usuarios (id,nombre) values (,"Marge"); insert into usuarios (id,nombre) values (,"Maggie"); root@devuan:~# perl -pe '$i++; s{\(,}{\($i,}' < usuarios.txt > usuarios.sql root@devuan:~# cat usuarios.sql insert into usuarios (id,nombre) values (1,"Bart"); insert into usuarios (id,nombre) values (4,"Lisa"); insert into usuarios (id,nombre) values (5,"Homero"); insert into usuarios (id,nombre) values (6,"Marge"); insert into usuarios (id,nombre) values (7,"Maggie");
Yapa: cómo generar las sentencias SQL automáticamente
Supongamos que tengo el archivo con los nombres y quiero generar las sentencias SQL del ejemplo anterior:
root@devuan:~# cat usuarios.txt Bart Lisa Homero Marge Maggie
Con unas simples inserciones utilizando sed
, es posible generar las sentencias SQL:
root@devuan:~# INSERT="insert into usuarios \(id,nombre\) values \(,\"" root@devuan:~# cat usuarios.txt | sed -e "s/^./$insertsql&/" | sed -e "s/.$/&\"\);/" insert into usuarios (id,nombre) values (,"Bart"); insert into usuarios (id,nombre) values (,"Lisa"); insert into usuarios (id,nombre) values (,"Homero"); insert into usuarios (id,nombre) values (,"Marge"); insert into usuarios (id,nombre) values (,"Maggie");
Esto es una clara prueba de que cuando uno domina más o menos la consola, puede realizar un trabajo de manera mucho más rápida y eficiente que, por ejemplo en este caso, un editor de texto gráfico.