Hoy vamos a ver una pequeña introducción a sed en Linux. Veremos cómo remplazar texto de un archivo y enviarlo a otro archivo, enviarlo en la terminal, modificar el archivo original o recibir el texto de una tubería (mejor dicho, de la entrada estándar).
Para ello usaremos sed (stream editor) y la terminal.
Modo de uso de sed para sustituir texto
La forma básica de sustituir es:
sed s/Búsqueda/Remplazo/ nombre_archivo
Eso leerá el archivo y remplazará la primera ocurrencia de Búsqueda
con Remplazo
; mostrando el resultado en la terminal o, mejor dicho, en la salida estándar.
Si quieres que el remplazo sea global, pasa la opción g:
sed s/Búsqueda/Remplazo/g nombre_archivo
Recuerda que igualmente puedes omitir el nombre del archivo si vas a pasar el texto usando un pipe.
Remplazando texto con sed
Veamos el primer ejemplo. Tengo un documento de texto con lo siguiente:
Hola,tengo,comas,y,voy,a,remplazarlas,con,guiones,usando,sed
Voy a remplazar las comas por un guión, para ello ejecuto:
De este modo el texto ya modificado se imprime en la terminal.
Redirigiendo salida
Si quieres que el texto ya remplazado aparezca en otro archivo, es muy fácil; simplemente dirige la salida al mismo, usando >
.
Por ejemplo, si quiero que el texto arreglado de ejercicio1.txt se vaya a ejercicio1_corregido.txt haría lo siguiente:
Modificar archivo directamente (inline)
Veamos otra opción. Si tú quieres que sed
modifique el archivo, es decir, que el texto de salida sea escrito en el archivo de entrada, pasa la opción -i
. Veamos el siguiente ejemplo:
Comenzamos mostrando el contenido del archivo. Después hacemos la sustitución pero pasamos la opción -i
a sed, que indica que modifique el archivo original.
Eso hará que el texto sea remplazado y que sea guardado en el archivo original. Al mostrarlo de nuevo, vemos que se ha remplazado correctamente.
Usando pipes
Este editor es un editor de streams; su nombre lo indica. Por lo tanto podemos usar las tuberías o pipes para pasarle contenido. Un ejemplo sencillo es el siguiente…
Para ver el tiempo que lleva encendido el sistema operativo podemos usar uptime
. Eso mostrará algo como:
11:34:18 up 4 days, 14:47, 1 user, load average: 1.67, 1.57, 1.66
Ahora quiero remplazar “days” por “días” así que puedo hacerlo enviando la salida de uptime por una tubería hacia sed, y remplazarlo:
El comando fue: uptime | sed s/days/días/
y no utilicé la opción global puesto que solo quise remplazar la primer ocurrencia.
Obviamente podría redireccionar la salida a un archivo; enviársela a sed de nuevo, etcétera. Ventajas y bellezas de Linux.