Cómo usar Sed en Linux

Sed es un programa UNIX simple que no crea ni edita archivos. Solo modifica los datos que pasan por su entrada y presenta los datos modificados en su salida. Aquí, echamos un vistazo a una breve descripción de la filosofía UNIX, pasamos por lo básico de usar sed y te mostramos ejemplos de cómo usar el programa para tareas diarias.
Tabla de Contenidos
- Lo Básico de Usar Sed
- Seleccionar y Recortar Flujos de Texto
- Eliminar Texto de un Flujo de Sed
- Agregar Nuevo Texto a Flujos de Sed
- Encontrar y Reemplazar Texto en Sed
- Copiar Datos de Texto al Espacio de Retención
- Usar Etiquetas para Crear Bucles en Sed
- Hacer Cambios Permanentes en Sed
Lo Básico de Usar Sed
Sed es un programa que puede leer y modificar flujos de datos de texto. Esto significa que, a diferencia de un editor de texto normal, sed no cambia directamente los archivos en tu computadora. En cambio, actúa más como un “filtro” para los datos entrantes y te permite transformarlos de la manera que desees.
Para empezar a usar sed, primero crea un archivo con al menos cinco líneas de texto dentro de él. Asegúrate de que haya un carácter de “nueva línea” entre tus líneas:
printf"hello\nmaketecheasier\nworld\nthis\nis\nwonderful\n"> hello.txtNota: aunque esta guía usa un archivo de texto de varias líneas para demostrar sed, todos los subcomandos en el programa también funcionarán con texto que provenga de tuberías UNIX.
El comando general para sed es algo como:
sed[opción]'{script}'[archivo de texto]Una de las funciones más básicas en sed es el subcomando n. Funciona leyendo datos de la entrada de sed y colocándolos en el “espacio de patrones” de tu programa. Este es un búfer especial que mantiene cualquier texto entrante antes de que sed lo manipule:
sed n hello.txt
Otra de las funciones básicas de sed es el subcomando p. Similar a n, lee los datos que llegan desde la entrada de sed y los coloca en el espacio de patrones del programa. Sin embargo, también los imprime explícitamente en la salida de tu terminal.
Usar el subcomando p puede resultar confuso para los principiantes, ya que ejecutarlo con cualquier entrada de texto resulta en que sed imprime su salida dos veces. Esto se debe a que, por defecto, sed imprime automáticamente su espacio de patrones independientemente de si p está presente o no:
sed p hello.txt
Para deshabilitar este comportamiento peculiar, agrega la opción -n antes de ejecutar tus subcomandos de sed:
sed-n p hello.txt
Con lo básico fuera del camino, las siguientes secciones examinarán las diferentes maneras en que puedes usar sed para manipular datos de texto.
1. Seleccionar y Recortar Flujos de Texto
Además de imprimir, también puedes usar sed para seleccionar y recortar texto de flujos de datos y archivos. La forma más fácil de hacerlo es añadiendo un valor de rango al subcomando p.
El siguiente comando usa la sintaxis de rango de sed para imprimir de la tercera a la quinta línea en tu archivo “hello.txt”:
sed-n'3,5p' hello.txt
También puedes usar el subcomando p para imprimir líneas no adyacentes en tu texto. Por ejemplo, lo siguiente imprime la primera y la cuarta línea en el archivo “hello.txt”:
sed-n'1p; 4p' hello.txt2. Eliminar Texto de un Flujo de Sed
Sed también puede eliminar datos de cualquier flujo de texto entrante. Esto es útil si deseas eliminar algunas líneas de texto de un archivo grande o limpiar la salida de un programa para mostrar solo la información que necesitas.
Para hacerlo, usa el subcomando d junto con la línea específica o el rango que deseas eliminar:
sed-n'2d; 5d; p' hello.txt
Similar a imprimir líneas de texto, el subcomando d trabaja con rangos de múltiples líneas. Por ejemplo, el siguiente comando eliminará las primeras cuatro líneas del archivo “hello.txt”:
sed-n'1,4d; p' hello.txtAdemás de hacer coincidir rangos de líneas específicos, puedes usar expresiones regulares para encontrar el texto que deseas eliminar. Esto indicará a sed que busque cualquier línea que contenga la palabra “world” y la elimine:
sed-n'/world/ d; p' hello.txtTambién puedes tratar las expresiones regulares como un rango para tu archivo de entrada. Esto te da más flexibilidad al definir tus selecciones dentro del programa:
sed-n'/world/,/wonderful/ d; p' hello.txt
3. Agregar Nuevo Texto a Flujos de Sed
Además de eliminar texto, sed también es capaz de agregar nuevo texto a flujos de datos existentes. Aunque no llega al nivel de un editor de texto completo, esta característica aún puede ser útil para ediciones puntuales y adiciones de texto básicas.
Para agregar una nueva línea de texto, ejecuta sed con el comando a seguido del texto que deseas agregar:
sed-ne'$a hello'-e'p' hello.txt
Nota: la opción -e le dice a sed que la cadena entre comillas después de ella es una expresión de sed. Esto te permite encadenar múltiples expresiones juntas sin invocar sed múltiples veces.
También es posible incluir archivos completos en un flujo de texto de sed. Para hacerlo, usa el comando r seguido del nombre del archivo que deseas agregar:
sed-ne'$r welcome.txt'-e'p' hello.txt
4. Encontrar y Reemplazar Texto en Sed
Una de las características más poderosas de sed es su capacidad para encontrar y reemplazar texto en un flujo de texto. A diferencia de agregar y eliminar texto, esto te permite editar datos de forma dinámica mientras pasan a través de las tuberías UNIX, lo que la hace mucho más flexible en comparación con un editor de texto normal.
Empieza imprimiendo tu entrada de texto de prueba sin ninguna modificación de sed:
sed-ne'p' hello.txt
Reemplaza el subcomando p con s, luego añade tres barras invertidas (/) después de él:
sed-ne's///'-e'p' hello.txtInserta una expresión regular estructural de la cadena de caracteres que deseas hacer coincidir entre la primera y segunda barra invertida. Por ejemplo, puedo poner el siguiente valor para buscar palabras que comienzan con “wo” en mi cadena de entrada:
sed-ne's/wo*.//'-e'p' hello.txtColoca el cursor de texto entre la segunda y tercera barra invertida, luego proporciona el texto que deseas reemplazar en tus coincidencias. A diferencia de la columna anterior, esta sección no usa expresiones regulares estructurales:
sed-ne's/wo.*/website/'-e'p' hello.txtPor defecto, sed solo reemplaza la primera cadena que coincide en cualquier línea en particular. Esto puede ser un problema si deseas reemplazar cada instancia de una palabra en tu flujo de texto. Para solucionar esto, añade la opción g después de la tercera barra invertida de tu expresión:
sed-ne's/wo.*/website/g'-e'p' hello.txt
5. Copiar Datos de Texto al Espacio de Retención
Sed utiliza dos búferes para almacenar datos de texto: el espacio de patrones y el espacio de retención. El primero sirve como un lugar temporal para tu texto mientras pasa por las expresiones de sed. Mientras tanto, el segundo actúa como un portapapeles donde puedes almacenar datos de texto arbitrarios.
Un beneficio de este enfoque es que te permite “mantener” ciertos resultados sin depender de programas externos. Esto puede ser útil si planeas usar sed para procesar manipulaciones de texto de múltiples pasos.
Para empezar a usar espacios de retención, primero asegúrate de que tienes un archivo con al menos unas pocas líneas de texto dentro:
sed-ne'p' hello.txtReemplaza el subcomando p con h, luego proporciona ya sea un número de línea o un valor regex que sed coincidirá en tu archivo. Hacer esto le indicará a sed que tome esa línea específica de texto y la copie a su espacio de retención:
sed-ne'3h' hello.txtNota: los datos dentro de un espacio de retención no persisten entre diferentes comandos de sed.
También puedes usar el subcomando H para almacenar múltiples líneas de texto dentro de tu espacio de retención. Por ejemplo, el siguiente comando almacena la tercera y cuarta línea de mi archivo de texto y las imprime de nuevo en la terminal:
sed-ne'3,4H; $ {x; p}' hello.txt
6. Usar Etiquetas para Crear Bucles en Sed
Aunque sed no es un lenguaje de programación completo, aún es posible crear bucles dentro del programa. Esto es útil si necesitas una expresión de sed que debe repasar continuamente un texto de entrada particular.
Para crear un bucle en sed, primero necesitas hacer una etiqueta para tu expresión de sed. Para eso, necesitas usar el subcomando : seguido de la etiqueta que quieres usar para tu expresión.
sed-e':x' hello.txtProporciona los criterios de coincidencia para tu expresión de sed. En mi caso, quiero que vaya al final de cada línea en mi texto de entrada:
sed-e':x; $' hello.txtEscribe los subcomandos de sed que deseas ejecutar cada vez que sed encuentre una coincidencia, luego enciérralo en llaves. Lo siguiente une dos líneas adyacentes, reemplaza el carácter de nueva línea con un espacio y luego vuelve al inicio de la expresión:
sed-e':x; /$/ {N; s/\n/ /g; bx}' hello.txt
Incluso puedes extender esto para hacer coincidir casi cualquier tipo de texto de entrada. Por ejemplo, el siguiente comando utiliza la característica regex extendida de sed para eliminar etiquetas HTML de tu texto de entrada:
sed-re':x; s/<[^>]*>//g; {N; bx}' hello.html
7. Hacer Cambios Permanentes en Sed
Al igual que con cualquier otra herramienta UNIX, sed puede aprovechar la redirección de salida y las tuberías. No solo permite unir sed con otros programas, sino que también te brinda la oportunidad de hacer que tus cambios sean permanentes.
La siguiente línea de código crea un nuevo archivo “welcome.txt” a partir de la salida de mi comando sed:
sed-ne'2p; 6p' hello.txt > hi.txt
Además de la redirección de salida, también puedes usar la opción -i integrada para editar tu archivo actual en lugar de mostrar tus cambios en la consola de tu terminal. Por ejemplo, el siguiente comando elimina cualquier carácter de nueva línea de mi archivo de texto y lo guarda:
sed-ie':x; $; {N; s/\n/ /g; bx}' hello.txt
Si toda esta conversación te ha dejado curioso sobre la línea de comandos de Linux. Puedes leer nuestro artículo anterior donde hablamos sobre algunos de los prompts de Bash más interesantes que puedes usar hoy.