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 modificadorp). - 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
gal final de una orden de sustitución, lo que provoca quesedreemplace ú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
-isin 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
awkgreptrcutpatch
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
- Crea un archivo de texto llamado
texto.txtcon varias líneas repetidas que contengan la palabra "linux". Utilizasedpara sustituir todas las apariciones de "linux" por "UNIX" en pantalla. - Ejecuta el mismo comando anterior añadiendo la opción
-ipara comprobar cómo se modifican los datos de manera permanente dentro del archivo físico. - Emplea el comando
sedcombinado con la opción de borradodpara eliminar todas las líneas en blanco de un archivo de registro de pruebas. - Utiliza el comando
sed -njunto con un rango de números de línea para extraer y visualizar únicamente un fragmento específico de un fichero de configuración. - Compara la sintaxis y la complejidad de utilizar
sedpara reemplazar un texto con respecto a realizar la misma operación mediante un script equivalente en PowerShell si dispones de Windows. - 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'.