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.