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.


Tal vez pueda interesarte


Compartí este artículo