Reemplazos con sed

Written By :

Category :

General

,

guias

,

Linux

Posted On :

Share This :

Hoy por cuestiones de la vida aprendí a sustituir con el comando sed  un caracter (o cadena de caracteres… como quieran) de un archivo solo en su primera aparición. Como me pareció útil les dejo la receta de cocina.

La necesidad y los problemas fueron los siguientes: Necesidad: Asumamos que tenemos en un archivo, el log de visitantes que alguna vez en su vida revisaron google (pocos no?)… y sabemos que alguna vez Mr.Privativo reviso google. Si quisieramos cambiar el nombre de este Señor (porque gracias al fucking copyright no nos dejan decirlo) y queremos colocarle MR-MICROSHIT…. OJO… pero solo la primera vez que vio la web… como haríamos? Problema: sed es un comando que se ejecuta en cada línea del archivo que tratamos, así que si no aplicáramos los siguientes filtros, sed buscaría la coincidencia y la reemplazaría… pero en cada linea (o salto de linea) del documento… dándonos como resultado que cambiaría una vez el nombre del señor… en tooodas las lineas del documento. Eso NO es lo que queremos; solo queremos la primera vez. Filtros: sed: el comando que ejecutará todo (considerado por muchos un lenguaje en si mismo) –i : esto sobreescribirá el archivo (si no lo aplicamos veremos la salida por pantalla pero no cambiaremos el archivo en si) –ne: Vamos a ejecutar algo parecido a un bucle, así que lo separaremos, y gracias a esto sed ejecutara lo que este dentro de los {} como una instrucción siguiente a la nueva. H : ya que sed pasa el comando linea por linea, con esto haremos creer que todo el documento es una línea, y ejecutará el reemplazo una sola vez en todo el documento. s/patrón/cambio : Indica “sustituye todo lo que se llame patrón por la palabra cambio” p : Luego de que ejecute el cambio, digale a sed que todo el documento no era una sola linea… eran varias, pero que mantenga el único cambio que se hizo. Así… finalmente nos queda estructurada la siguiente linea:

sed -i -ne ‘H;${g;s/patrón/cambio/;p}’ archivo Ahora… como demonios funciona eso o que significa? algo así mas o menos:

“Con esto (sed) vamos a sobre-escribir (-i), usando un script que leeremos (-ne) que convertirá todo en una sola línea (H) y la leerá como si fuera todo el archivo (g) sustituyendo un patrón por un cambio (s/patrón/cambio/) y lo hará sin modificar el orden de las lineas que asumimos como una (;p); todo esto lo hará sobre el archivo (archivo)

Como vivimos en un mundo LIBRE y tenemos muchas otras cosas por hacer, aqui hay otras 4 instrucciones que podríamos usar para fines PARECIDOS pero no iguales:

sed ‘s/perro/gato/’ file

Cambia “perro”  por “gato” una vez en cada linea del archivo “file”

sed ‘s/perro/gato/g’ file

 Cambia “perro”  por “gato” todas las veces que exista entodas las lineas del archivo “file”

 sed ‘/cosa/,/fin/s/perro/gato/’ file

 Cambia “perro”  por “gato” desde el momento en que encuentre la palabra “cosa” y hasta que encuentre la palabra “fin” en el archivo “file”

sed ‘8,20s/perro/gato/’ file 

 Cambia “perro”  por “gato” desde la linea “8” y hasta la linea “20” en el archivo “file

 

Salutex y ojala le sirva a alguien asi como me sirvio a mi :DÂ