En el post anterior, hablamos de las funciones de bash y de cómo utilizarlas desde la línea de comandos directamente, y vimos algunas otras cosas interesantes. Hoy hablaremos de una práctica herramienta para la manipulación de cadenas llamada sed o comando sed Linux.
Usamos sed para trabajar con archivos de texto como archivos de registro, archivos de configuración y otros archivos de texto.
En este post, nos vamos a centrar en el comando sed Linux, que se utiliza para la manipulación de texto, que es un paso esencial en nuestro viaje de scripting bash.
El sistema Linux proporciona algunas herramientas para el procesamiento de texto; una de esas herramientas es sed.
Discutiremos los más de 31 ejemplos con imágenes para mostrar la salida de cada ejemplo.
Tabla de contenidos
Entender el comando sed Linux
El comando sed es un editor de texto no interactivo. El comando sed Linux edita los datos basándose en las reglas que le proporcionas; puedes usarlo así:
$ sed options file
No estás limitado a usar sed para manipular archivos; lo aplicas al STDIN directamente así:
$ echo "Welcome to LikeGeeks page" | sed 's/page/website/'

El comando s reemplaza el primer texto por el segundo patrón de texto. En este caso, sustituimos la cadena «website» por la palabra «page».
El ejemplo anterior era un simple ejemplo para demostrar la herramienta. Podemos utilizar el comando sed de Linux para manipular archivos también.
Creemos un archivo de ejemplo :

$ sed 's/test/another test/' ./myfile
Los resultados se imprimen en la pantalla instantáneamente; no hay que esperar a procesar el archivo hasta el final.
Si su archivo es lo suficientemente masivo, verá el resultado antes de que el procesamiento termine.
El comando Linux de Sed no actualiza sus datos. Sólo envía el texto modificado a STDOUT. El archivo sigue intacto. Si necesitas sobrescribir el contenido existente, puedes consultar nuestro post anterior, que hablaba de las redirecciones.
Usando múltiples comandos sed de Linux en la línea de comandos
Para ejecutar múltiples comandos sed, puedes usar la opción -e así:
$ sed -e 's/This/That/; s/test/another test/' ./myfile

Debes separar los comandos sed por un punto y coma sin espacios.
También puedes usar una comilla simple para separar los comandos así:
$ sed -e '> s/This/That/> s/test/another test/' myfile

El mismo resultado, nada del otro mundo.
Lectura de comandos desde un archivo
Puedes guardar tus comandos sed en un archivo y utilizarlos especificando el archivo mediante la opción -f.
$ cat mycommandss/This/That/s/test/another test/
$ sed -f mycommands myfile

Sustitución de banderas
Mira el siguiente ejemplo con atención:
$ cat myfile
$ sed 's/test/another test/' myfile

El resultado anterior muestra que sustituimos la primera ocurrencia en cada línea. Para sustituir todas las ocurrencias de un patrón, utilice una de las siguientes banderas de sustitución.
Podemos escribir las banderas así:
s/pattern/replacement/flags
Hay cuatro tipos de sustituciones:
- g, reemplazar todas las ocurrencias.
- Un número, el número de ocurrencia para el nuevo texto que desea sustituir.
- p, imprimir el contenido original.
- w archivo: significa escribir los resultados en un archivo.
Puedes limitar el reemplazo especificando el número de ocurrencia que debe ser reemplazado así:
$ sed 's/test/another test/2' myfile

Como puedes ver, reemplazamos sólo la segunda ocurrencia en cada línea.
La bandera g significa global, lo que significa un reemplazo global para todas las ocurrencias:
$ sed 's/test/another test/g' myfile

La bandera p imprime cada línea contiene una coincidencia de patrón, puedes usar la opción -n para imprimir sólo las líneas modificadas.
$ cat myfile
$ sed -n 's/test/another test/p' myfile

La bandera w guarda la salida en un archivo especificado:
$ sed 's/test/another test/w output' myfile

Imprimimos la salida en la pantalla, pero guardamos las líneas coincidentes en el archivo de salida.
Reemplazar caracteres
Supongamos que quieres buscar el shell bash y reemplazarlo por el shell csh en el archivo /etc/passwd usando sed, bueno, puedes hacerlo fácilmente:
$ sed 's/\/bin\/bash/\/bin\/csh/' /etc/passwd
¡Oh!!! eso se ve terrible.
Por suerte, hay otra manera de lograr eso. Puedes usar el signo de exclamación (!) como delimitador de cadenas así:
$ sed 's!/bin/bash!/bin/csh!' /etc/passwd
Ahora es más fácil de leer.
Limitando sed
El comando sed procesa todo tu archivo. Sin embargo, puedes limitar el comando sed para que procese líneas específicas; hay dos formas:
- Un rango de líneas.
- Un patrón que coincida con una línea específica.
Puedes escribir un número para limitarlo a una línea específica:
$ sed '2s/test/another test/' myfile

Sólo modificamos la línea dos.
¿Qué tal si usamos un rango de líneas:
$ sed '2,3s/test/another test/' myfile

También podemos empezar desde una línea hasta el final del archivo:
$ sed '2,$s/test/another test/' myfile

O puedes usar un patrón como este:
$ sed '/likegeeks/s/bash/csh/' /etc/passwd

¡Asombroso!
Puedes usar expresiones regulares para escribir este patrón y que sea más genérico y útil.
Borrar líneas
Para borrar líneas usando sed, puedes usar la bandera delete (d) es tu amiga.
La bandera delete borra el texto del stream, no el archivo original.
$ sed '2d' myfile

Aquí borramos la segunda línea sólo de miarchivo.
¿Qué hay de borrar un rango de líneas?
$ sed '2,3d' myfile

Aquí borramos un rango de líneas, la segunda y la tercera.
Otro tipo de rangos:
$ sed '3,$d' myfile

Aquí borramos desde la tercera línea hasta el final del fichero.
Todos estos ejemplos nunca modifican su archivo original.
$ sed '/test 1/d' myfile

Aquí utilizamos un patrón para borrar la línea si coincide en la primera línea.
Si necesitas borrar un rango de líneas, puedes usar dos patrones de texto como este:
$ sed '/second/,/fourth/d' myfile

Borramos desde la segunda hasta la cuarta línea.
Insertar y anexar texto
Puede insertar o anexar líneas de texto utilizando las siguientes banderas:
- La bandera (i).
- La bandera (a).
$ echo "Another test" | sed 'i\First test '

Agregamos el texto antes de la línea especificada.
$ echo "Another test" | sed 'a\First test '

Añadimos el texto después de la línea especificada.
¿Y qué hay de añadir texto en el medio?
Fácil, mira el siguiente ejemplo:
$ sed '2i\This is the inserted line.' myfile

Y el appending funciona igual, pero fíjate en la posición del texto anexado:
$ sed '2a\This is the appended line.' myfile

Utilizamos las mismas banderas pero con una ubicación de inserción o apéndice.
Modificación de líneas
Para modificar una línea específica, puedes usar la bandera (c) así:
$ sed '3c\This is a modified line.' myfile

Puedes usar un patrón de expresión regular, y todas las líneas que coincidan con ese patrón serán modificadas.
$ sed '/This is/c Line updated.' myfile

Transforma los caracteres
La bandera de transformación (y) funciona en caracteres como este:
$ sed 'y/123/567/' myfile

Aplicamos la transformación a todos los datos, y no podemos limitarla a una ocurrencia específica.
Imprimir números de línea
Puedes imprimir el número de línea usando el signo (=) así:
$ sed '=' myfile

Sin embargo, usando -n combinado con el signo igual, el comando sed muestra el número de línea que contiene coincidencias.
$ sed -n '/test/=' myfile

Leer datos de un archivo
Puede utilizar la bandera (r) para leer datos de un archivo.
Puede definir un número de línea o un patrón de texto para el texto que desea leer.
$ cat newfile
$ sed '3r newfile' myfile

Insertamos el contenido después de la tercera línea como se esperaba.
Y esto es usando un patrón de texto:
$ sed '/test/r newfile' myfile

¿Qué bien, verdad?
Ejemplos útiles
Supongamos que tenemos un archivo que contiene texto con un marcador de posición, y tenemos otro archivo que contiene los datos que llenarán el marcador de posición en el otro archivo.
Utilizaremos las banderas (r) y (d) para hacer el trabajo.
La palabra DATA en ese archivo es un marcador de posición para un contenido real que almacenaremos en otro archivo llamado data.
La sustituiremos por el contenido real:
$ Sed '/DATA>/ {r newfiled}' myfile

¡Impresionante!!! como puedes ver, hemos llenado la ubicación del placeholder con los datos del otro archivo.
Esto es sólo una pequeña introducción sobre el comando sed. El comando sed Linux es otro mundo por sí mismo.
La única limitación es tu imaginación.
Espero que te resulte fácil manipular cadenas usando el comando sed Linux.
Gracias.
Fundador de LikeGeeks. Trabajo como administrador de sistemas Linux desde 2010. Soy responsable del mantenimiento, la seguridad y la resolución de problemas de servidores Linux para múltiples clientes en todo el mundo. Me encanta escribir scripts de shell y Python para automatizar mi trabajo.