Comando sed

sed

El comando sed (abreviatura de Stream Editor, o editor de flujos) es una potente utilidad de la línea de comandos en sistemas Unix y Linux diseñada para procesar, filtrar, transformar y modificar textos de manera automatizada y sin necesidad de abrir un editor interactivo.

Categoría Procesamiento de texto y automatización
Disponible en Linux, macOS y sistemas operativos tipo Unix
Equivalente en Windows Scripts de PowerShell (Get-Content ... | ForEach-Object), editores de texto mediante bucles o utilidades de terceros.
Sustituye a Ediciones manuales repetitivas en archivos de configuración masivos mediante editores de texto visuales.
¿Requiere permisos de administrador? No, salvo que se intente modificar o sobrescribir un archivo del sistema ubicado en directorios protegidos (como /etc).

¿Qué significa su nombre?

SED proviene de la contracción en inglés de Stream Editor (Editor de flujos).

Su nombre define con precisión su cometido: actúa como un filtro que procesa un flujo de datos (entrada estándar o un archivo línea por línea) aplicando transformaciones al vuelo.

¿Para qué sirve?

El comando sed sirve para realizar operaciones de búsqueda y sustitución de textos, eliminar o insertar líneas de manera selectiva, y automatizar modificaciones complejas en ficheros de texto plano mediante expresiones regulares. Es una herramienta indispensable en la caja de herramientas de cualquier administrador de sistemas para la edición desatendida de archivos de configuración.

A diferencia de los editores interactivos tradicionales, sed procesa todo el archivo en memoria o mediante un búfer temporal de una sola pasada (a menos que se usen comandos de salto avanzados), lo que lo hace extremadamente rápido para procesar ficheros de registro gigantescos o scripts de despliegue automatizados.

Sintaxis

sed [opciones] 'script' [fichero...]

Las opciones y modificadores más habituales son:

Opción o Modificador Descripción
-n Suprime la impresión automática del búfer; se suele combinar con el comando de impresión p para mostrar solo las líneas filtradas.
-e [script] Permite encadenar múltiples comandos o reglas de edición en una misma ejecución.
-i Modifica y guarda los cambios directamente sobre el archivo original de forma permanente (edición in situ).
s/patrón/reemplazo/ Sustituye la primera coincidencia del patrón especificado por el texto de reemplazo en cada línea.
g (global) Modificador que se añade al final de una sustitución para aplicarla a todas las coincidencias de la línea, no solo a la primera.

Comandos más utilizados

Comando Descripción
sed 's/antiguo/nuevo/g' fichero.txt Sustituye todas las apariciones de la palabra "antiguo" por "nuevo" en todo el documento.
sed -i 's/error/ok/g' config.cfg Modifica directamente el archivo de configuración sobrescribiéndolo con los cambios aplicados.
sed '3d' fichero.txt Elimina visualmente la tercera línea del archivo durante el procesamiento.
sed -n '5,10p' fichero.txt Muestra únicamente el rango de líneas comprendido entre la 5 y la 10.

Equivalencia con otros sistemas

Acción Linux (sed) Linux alternativo Windows (PowerShell)
Sustituir texto en archivo sed -i 's/a/b/g' file awk '{gsub(/a/,"b"); print}' (Get-Content file) -replace 'a','b' | Set-Content file
Imprimir líneas específicas sed -n '2,5p' file awk 'NR>=2 && NR<=5' Get-Content file | Select-Object -Index 1..4
Eliminar líneas en blanco sed '/^$/d' file grep -v '^$' file Get-Content file | Where-Object {$_ -ne ''}
Eliminar patrón de líneas sed '/patron/d' file grep -v 'patron' file Get-Content file | Where-Object {$_ -notmatch 'patron'}

Ejemplos

Sustituir una cadena de texto en un flujo

echo "Hola mundo Linux" | sed 's/mundo/Sistemas/'

Sustituir todas las coincidencias de una palabra en un archivo completo de manera global

sed 's/puerto=80/puerto=8080/g' /etc/servidor.conf

Modificar un archivo de texto de forma permanente guardando los cambios

sed -i 's/desactivado/activado/g' entorno.env

Mostrar únicamente un rango determinado de líneas (ej. de la línea 10 a la 20)

sed -n '10,20p' syslog.log

Ejemplo de salida

# Configuración general del demonio SSH
Port 22
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication yes
X11Forwarding yes

¿Cómo interpretar la salida?

  • Flujo modificado: el resultado muestra las líneas del archivo de texto original con las reglas de sustitución o filtrado aplicadas en tiempo real.
  • Supresión con -n: si se emplea la opción -n, el terminal permanecerá completamente silencioso salvo para aquellas líneas que coincidan explícitamente con las reglas de impresión (como el modificador p).
  • Silencio en opción -i: cuando se utiliza el parámetro de guardado in situ, el comando no devuelve nada por pantalla si la ejecución se ha completado de forma correcta.

Errores habituales

  • Olvidar añadir el modificador global g al final de una orden de sustitución, lo que provoca que sed reemplace únicamente la primera coincidencia que encuentra en cada línea y omita las demás.
  • Modificar un archivo crítico del sistema utilizando la opción -i sin haber realizado previamente una copia de seguridad o un respaldo del fichero original.

Conceptos relacionados

  • Expresiones regulares (Regex)
  • Editor de flujos
  • Flujos estándar (E/S)
  • Comando awk
  • Comando grep
  • Edición in situ

Comandos relacionados

  • awk
  • grep
  • tr
  • cut
  • patch

Curiosidades

A pesar de haber sido desarrollado a principios de la década de 1970 en los laboratorios Bell por Lee E. McMahon como una evolución de los editores de línea anteriores, sed sigue siendo una herramienta fundamental e insustituible en los scripts de despliegue actuales debido a su extrema ligereza, su velocidad de procesamiento en memoria y su total compatibilidad con cualquier entorno POSIX.

Prácticas propuestas

  1. Crea un archivo de texto llamado texto.txt con varias líneas repetidas que contengan la palabra "linux". Utiliza sed para sustituir todas las apariciones de "linux" por "UNIX" en pantalla.
  2. Ejecuta el mismo comando anterior añadiendo la opción -i para comprobar cómo se modifican los datos de manera permanente dentro del archivo físico.
  3. Emplea el comando sed combinado con la opción de borrado d para eliminar todas las líneas en blanco de un archivo de registro de pruebas.
  4. Utiliza el comando sed -n junto con un rango de números de línea para extraer y visualizar únicamente un fragmento específico de un fichero de configuración.
  5. Compara la sintaxis y la complejidad de utilizar sed para reemplazar un texto con respecto a realizar la misma operación mediante un script equivalente en PowerShell si dispones de Windows.
  6. Investiga cómo utilizar barras verticales u otros caracteres delimitadores alternativos (como sed 's#antiguo#nuevo#') cuando la ruta que deseas sustituir contiene barras diagonales de directorios.

Consejo: Acostúmbrate a probar primero tus expresiones de sustitución con sed imprimiendo por pantalla (sin la opción -i) para verificar que el resultado es exactamente el esperado antes de aplicarlo de forma permanente sobre archivos importantes del sistema.

Haz clic aquí para ver las soluciones y explicaciones

1. Crea un archivo de texto llamado texto.txt con varias líneas repetidas que contengan la palabra "linux". Utiliza sed para sustituir todas las apariciones de "linux" por "UNIX" en pantalla.

Para realizar esta tarea de forma global en cada línea, se ejecuta el comando indicando el patrón de sustitución con el modificador final g: sed 's/linux/UNIX/g' texto.txt. Esto procesará el archivo y volcará el resultado transformado directamente en la consola.


2. Ejecuta el mismo comando anterior añadiendo la opción -i para comprobar cómo se modifican los datos de manera permanente dentro del archivo físico.

Añadiendo el parámetro de edición in situ, el comando queda de la siguiente forma: sed -i 's/linux/UNIX/g' texto.txt. Al ejecutarlo, sed sobrescribirá automáticamente el archivo original guardando los cambios de forma persistente en el disco duro sin mostrar salida por pantalla.


3. Emplea el comando sed combinado con la opción de borrado d para eliminar todas las líneas en blanco de un archivo de registro de pruebas.

Para suprimir las líneas vacías utilizando expresiones regulares, se emplea el comando de borrado asociado al patrón de línea nula: sed '/^$/d' fichero.txt. El símbolo ^ indica el principio de línea y $ el final, por lo que coincidirá exactamente con las líneas que no contengan ningún carácter.


4. Utiliza el comando sed -n junto con un rango de números de línea para extraer y visualizar únicamente un fragmento específico de un fichero de configuración.

Combinando la opción de supresión de impresión automática -n con el comando de impresión p, la sintaxis para mostrar por ejemplo de la línea 5 a la 10 sería: sed -n '5,10p' configuracion.conf. De esta manera se evita imprimir el resto del documento.


5. Compara la sintaxis y la complejidad de utilizar sed para reemplazar un texto con respecto a realizar la misma operación mediante un script equivalente en PowerShell si dispones de Windows.

Mientras que en Linux sed resuelve la sustitución de forma muy concisa y directa con una sola línea de parámetros (sed -i 's/a/b/g' file), PowerShell en Windows requiere un pipeline explícito que lea el contenido, aplique el operador de reemplazo y vuelva a volcar los datos: (Get-Content file) -replace 'a','b' | Set-Content file.


6. Investiga how utilizar barras verticales u otros caracteres delimitadores alternativos (como sed 's#antiguo#nuevo#') cuando la ruta que deseas sustituir contiene barras diagonales de directorios.

Por defecto, sed utiliza la barra diagonal / como delimitador del comando de sustitución. Si se intenta modificar una ruta de directorio (por ejemplo, cambiar /var/www por /srv/www), las barras de la ruta chocarían con el comando, obligando a escapar cada barra con una barra invertida (\/). Cambiando el carácter delimitador inicial por otro símbolo válido como la almohadilla (#), la sintaxis se simplifica enormemente: sed 's#/var/www#/srv/www#g'.