Tutorial práctico de sed: sustituciones y borrado de líneas con direcciones
Introducción
Si trabajás con archivos de texto en Linux o macOS, seguramente te encontraste con la necesidad de hacer cambios masivos: reemplazar una palabra, eliminar líneas que no sirven o ajustar formato de datos. Hacerlo manualmente es lento y propenso a errores; ahí entra sed (Stream EDitor), una herramienta de línea de comandos que permite editar flujos de texto de forma rápida y poderosa.
Este tutorial está dirigido a desarrolladores, administradores de sistemas y cualquier persona que maneje archivos de configuración, logs o datos CSV y quiera automatizar tareas de transformación de texto sin escribir un script completo. Al finalizar, vas a saber:
- La sintaxis básica de sed y cómo invocarlo.
- Cómo realizar sustituciones simples y avanzadas con la expresión
s/patron/replacement/. - Qué son las direcciones y cómo usarlas para actuar sobre líneas específicas, rangos o patrones.
- Cómo borrar líneas con la orden
dy combinarla con direcciones. - Ejemplos reales sobre archivos de muestra, con la salida esperada que podés verificar en tu terminal.
- Buenas prácticas y errores comunes que suelen aparecer al comenzar.
Prepará tu terminal y un archivo de ejemplo; vamos a poner manos a la obra.
¿Qué es sed y cómo funciona?
s ed lee entrada línea por línea (puede ser un archivo o la salida de otro comando mediante un pipe), aplica las operaciones que le indicás y escribe el resultado en la salida estándar. Por defecto no modifica el archivo original; para guardar cambios tenés que redirigir la salida a un nuevo archivo o usar la opción -i (editar in‑place).
La forma más simple de invocarlo es:
sed 'operacion' archivo.txt
Entre comillas simples va el script de sed, que puede contener una o varias órdenes separadas por punto y coma (;) o newline.
Sintaxis de una orden
Una orden tiene la forma:
[dirección]comando[argumentos]
- Dirección (opcional): indica a qué líneas se aplica el comando. Puede ser un número de línea, un patrón entre
/, o un rango comoinicio,fin. - Comando: la acción a ejecutar (
spara sustitución,dpara borrar,ppara imprimir, etc.). - Argumentos: dependen del comando; para
sson el patrón, el reemplazo y opcionalmente flags.
Sustituciones básicas con s/patron/replacement/
La orden más usada de sed es la sustitución. Su sintaxis es:
s/patron/replacement/flags
Donde:
patrones una expresión regular básica (BRE) que sed intenta encontrar en cada línea.replacementes el texto que lo sustituirá.flagsmodifican el comportamiento:g(global, reemplazar todas las ocurrencias en la línea),i(ignorar mayúsculas/minúsculas),p(imprimir la línea si se hizo la sustitución),w archivo(escribir la línea en un archivo).
Archivo de ejemplo
Creemos un archivo llamado ejemplo.txt con el siguiente contenido:
Linux es genial
Windows también es útil
macOS es bonito
Linux y Windows son populares
GNU/Linux es una variante
EOF
Guardalo y verifiquemos su contenido:
cat ejemplo.txt
Salida esperada:
Linux es genial
Windows también es útil
macOS es bonito
Linux y Windows son populares
GNU/Linux es una variante
EOF
Sustitución simple (primera coincidencia por línea)
Queremos cambiar la palabra "Linux" por "GNU/Linux" solo la primera aparición en cada línea:
sed 's/Linux/GNU\/Linux/' ejemplo.txt
Nota: la barra diagonal en el reemplazo debe escaparse porque es el delimitador; otra opción es usar otro delimitador, como |:
sed 's|Linux|GNU/Linux|' ejemplo.txt
Salida esperada:
GNU/Linux es genial
Windows también es útil
macOS es bonito
GNU/Linux y Windows son populares
GNU/Linux es una variante
EOF
Observá que solo la primera "Linux" de cada línea cambió; la segunda aparición en la cuarta línea quedó intacta porque no usamos la bandera g.
Sustitución global (g)
Para reemplazar todas las ocurrencias de "Linux" en cada línea:
sed 's/Linux/GNU\/Linux/g' ejemplo.txt
Salida esperada:
GNU/Linux es genial
Windows también es útil
macOS es bonito
GNU/Linux y Windows son populares
GNU/Linux es una variante
EOF
Ahora la cuarta línea muestra "GNU/Linux y Windows" porque ambas instancias fueron cambiadas.
Ignorar mayúsculas y minúsculas (i)
Si queremos que la búsqueda no distinga mayúsculas:
sed 's/linux/GNU\/Linux/gi' ejemplo.txt
Salida esperada (notá que la primera línea ya tenía "Linux" con mayúscula inicial, pero ahora también afecta a "linux" si estuviera en minúscula):
GNU/Linux es genial
Windows también es útil
macOS es bonito
GNU/Linux y Windows son populares
GNU/Linux es una variante
EOF
En este caso no hay diferencia porque todas las coincidencias ya estaban con mayúscula inicial, pero la bandera i es útil cuando el texto varía.
Imprimir solo las líneas modificadas (p)
Combinando la bandera p con la opción -n (que suprime la impresión automática) podemos ver solo las líneas donde ocurrió la sustitución:
sed -n 's/Linux/GNU\/Linux/p' ejemplo.txt
Salida esperada:
GNU/Linux es genial
GNU/Linux y Windows son populares
GNU/Linux es una variante
Las líneas que no contenían "Linux" no aparecen.
Escribir líneas modificadas a un archivo (w)
Supongamos que queremos guardar en linux_lineas.txt solo las líneas que tuvimos que cambiar:
sed -n 's/Linux/GNU\/Linux/w linux_lineas.txt' ejemplo.txt
Luego, verificamos:
cat linux_lineas.txt
Salida esperada:
GNU/Linux es genial
GNU/Linux y Windows son populares
GNU/Linux es una variante
Trabajando con direcciones
Hasta ahora aplicamos las sustituciones a todas las líneas. Las direcciones nos permiten limitar el alcance a un subconjunto de líneas, lo que aumenta la precisión y evita cambios no deseados.
Direcciones por número de línea
Para actuar solo sobre la línea 2:
sed '2s/Windows/MS Windows/' ejemplo.txt
Salida esperada:
Linux es genial
MS Windows también es útil
macOS es bonito
Linux y Windows son populares
GNU/Linux es una variante
EOF
Rango de líneas
Para aplicar una sustitución desde la línea 1 hasta la 3:
sed '1,3s/es/ES/' ejemplo.txt
Salida esperada:
Linux ES genial
Windows también ES útil
macOS ES bonito
Linux y Windows son populares
GNU/Linux es una variante
EOF
Dirección basada en patrón
Queremos cambiar "bonito" a "hermoso" solo en las líneas que contengan la palabra "macOS":
sed '/macOS/s/bonito/hermoso/' ejemplo.txt
Salida esperada:
Linux es genial
Windows también es útil
macOS es hermoso
Linux y Windows son populares
GNU/Linux es una variante
EOF
Rango de patrones
Podemos definir un rango que empieza en la primera línea que contiene "Linux" y termina en la primera línea que contiene "EOF":
sed '/Linux/,/EOF/s/es/ES/' ejemplo.txt
Salida esperada:
Linux ES genial
Windows también ES útil
macOS ES bonito
Linux y Windows son populares
GNU/Linux ES una variante
EOF
Notá que el rango incluye ambas líneas delimitadoras y todas las que están entre ellas.
Direcciones múltiples
Se pueden especificar varias direcciones separadas por coma; se aplica el comando a las líneas que coincidan con cualquiera de ellas (OR). Por ejemplo, aplicar a líneas 2 y 4:
sed '2,4s/es/ES/' ejemplo.txt
Esto es un rango, no una lista. Para una lista explícita usamos punto y coma:
sed '2s/es/ES/;4s/es/ES/' ejemplo.txt
Salida esperada:
Linux es genial
Windows también ES útil
macOS es bonito
Linux y Windows son populares
GNU/Linux ES una variante
EOF
Ahora solo las líneas 2 y 4 fueron modificadas.
Borrar líneas con la orden d
La orden d elimina la línea actual del patrón de espacio y no la imprime en la salida. Su forma general es:
[dirección]d
Borrar una línea específica
Eliminemos la tercera línea (la que dice "macOS es bonito"):
sed '3d' ejemplo.txt
Salida esperada:
Linux es genial
Windows también es útil
Linux y Windows son populares
GNU/Linux es una variante
EOF
Borrar un rango de líneas
Borremos desde la línea 2 hasta la 4:
sed '2,4d' ejemplo.txt
Salida esperada:
Linux es genial
EOF
Borrar líneas que coincidan con un patrón
Eliminemos todas las líneas que contengan la palabra "Windows":
sed '/Windows/d' ejemplo.txt
Salida esperada:
Linux es genial
macOS es bonito
GNU/Linux es una variante
EOF
Borrar líneas que no coincidan con un patrón
Para conservar solo las líneas que tengan "Linux" y borrar el resto, podemos usar la dirección de negación !:
sed '/Linux/!d' ejemplo.txt
Salida esperada:
Linux es genial
Linux y Windows son populares
GNU/Linux es una variante
EOF
La expresión /Linux/!d se lee como: "si la línea no contiene Linux, entonces borrar(d)).
Combinar sustitución y borrado en un mismo script
Supongamos que queremos:
- Cambiar "es" por "ES" en todas las líneas.
- Luego eliminar las líneas que contengan la palabra "EOF" (porque es un marcador de fin de archivo que no nos interesa).
Podemos encadenar órdenes con punto y coma:
sed 's/es/ES/g; /EOF/d' ejemplo.txt
Salida esperada:
Linux ES genial
Windows también ES útil
macOS ES bonito
Linux y Windows son populares
GNU/Linux ES una variante
El marcador EOF desapareció y todas las "es" pasaron a mayúsculas.
Ejercicios prácticos
Para consolidar lo aprendido, aquí tenés algunos desafíos. Intentalos en tu terminal antes de mirar la solución.
Ejercicio 1: Corregir fechas en un log
Archivo log.txt:
2023-09-01 10:15:00 INFO Inicio de servicio
2023-09-01 10:16:00 WARN Alta latencia
2023-09-02 09:00:00 ERROR Fallo de conexión
2023-09-02 09:05:00 INFO Servicio recuperado
Objetivo: cambiar el formato de fecha de YYYY-MM-DD a DD/MM/YYYY solo en las líneas de tipo INFO.
sed '/INFO/s/\([0-9]\{4\}\)-*\([0-9]\{2\}\)-*\([0-9]\{2\}\)/\3\/\2\/\1/' log.txt
Salida esperada:
01/09/2023 10:15:00 INFO Inicio de servicio
2023-09-01 10:16:00 WARN Alta latencia
02/09/2023 09:00:00 ERROR Fallo de conexión
02/09/2023 09:05:00 INFO Servicio recuperado
Explicación: la dirección /INFO/ limita la sustitución a esas líneas; la expresión regular captura año, mes y día y los reordena.
Ejercicio 2: Eliminar comentarios y líneas vacías de un script
Archivo script.sh:
#!/bin/bash
# Este es un comentario
set -e
# Otra línea de comentario
echo "Hola mundo"
# Fin
Objetivo: dejar solo las líneas de código reales (sin comentarios ni líneas completamente vacías).
Soluciónsed -e '/^#/d' -e '/^$/d' script.sh
Salida esperada:
#!/bin/bash
set -e
echo "Hola mundo"
Primera expresión elimina líneas que empiezan con #; la segunda elimina líneas vacías (^$).
Ejercicio 3: Duplicar líneas que contengan una palabra específica
Archivo palabras.txt:
manzana
banana
cereza
dátil
Objetivo: después de cada línea que contenga la letra "a", insertar una copia de esa misma línea.
Soluciónsed '/a/p' palabras.txt
Salida esperada:
manzana
manzana
banana
banana
cereza
dátil
dátil
La orden p imprime la línea; al combinarla con la dirección /a/ se imprimen dos veces: la original por el flujo normal y la extra por p.
Buenas prácticas y errores comunes
Buenas prácticas
- Usá comillas simples alrededor del script de sed para que el shell no interprete los caracteres especiales (como
$,*,\[, etc.). - Probá primero sin
-i. Ejecutá el comando y verificá la salida en pantalla antes de modificar el archivo original. - Prefirá delimitadores distintos cuando el patrón o el reemplazo contengan la barra diagonal (
/). Por ejemplo,s|ruta/antigua|ruta/nueva|evita escapes innecesarios. - Agrupá múltiples órdenes con
;o newline dentro de un mismo script para evitar lanzar varios procesos sed. - Usá la opción
-n+ppara depurar: mostrís solo las líneas que fueron afectadas. - Documentá tus scripts. Un comentario
#dentro del script de sed (se permite si usás-eo un archivo de script) ayuda a futuros lectores. - Guardá una copia de respaldo antes de usar
-i. Muchos sistemas permiten crear una copia automática con-i.bak.
Errores comunes
- Olvidar el
gcuando se quiere reemplazar todas las ocurrencias en una línea; el resultado suele ser parcial y difícil de detectar. - Confundir direcciones con patrones: escribir
/patrón/ s/foo/bar/(con espacio) genera un error de sintaxis porque el espacio se interpreta como otro comando. - Usar expresiones regulares avanzadas sin saber que sed usa BRE por defecto; para usar características de ERE (como
?,+,{}sin backslash) hay que agregar la opción-r(GNU sed) o-E(BSD/macOS). - Sobrescribir accidentalmente el archivo original con
-isin probar primero; siempre hacé un dry‑run. - No escapar caracteres especiales en el reemplazo (como
&o) lo que puede producir resultados inesperados. - Aplicar una dirección de rango demasiado amplia (por ejemplo,
/inicio/,/fin/cuando el patrón de fin aparece antes que el de inicio) y terminar modificando más líneas de lo esperado.
Conclusión
En este tutorial vimos cómo sed permite realizar transformaciones de texto potentes y rápidas usando una sintaxis compacta. Aprendiste:
- La estructura básica de una orden:
[dirección]comando[argumentos]. - Cómo usar la sustitución
s/patron/replacement/flagscon sus variantes (g,i,p,w). - El poder de las direcciones para actuar sobre líneas específicas, rangos o coincidencias de patrones, y cómo combinarlas con la negación
!. - Cómo borrar líneas con la orden
dy cómo unir sustituciones y borrados en un mismo script. - Varios ejemplos prácticos sobre archivos de muestra, con la salida esperada que podés replicar en tu terminal.
- Buenas prácticas para evitar errores comunes y trabajar de forma segura.
Con estas bases, podés automatizar tareas de limpieza de logs, preparación de archivos de configuración, procesamiento de CSV o cualquier escenario donde necesite editar flujos de texto sin lanzar un editor interactivo. La próxima vez que te encuentres frente a un archivo grande y necesites hacer un cambio repetido, pensá en sed: es rápido, está presente en casi todo sistema Unix‑like y, una vez que le tomás la mano, se vuelve una herramienta indispensable en tu caja de herramientas.
¡Probá los ejercicios, modificá los ejemplos a tu necesidad y seguí explorando la documentación de tu versión de sed (man sed o info sed) para descubrir aún más capacidades como direcciones avanzadas, branching y buffers de retención!"
DUGLAS MORENO
Comentarios (0)
Sé el primero en comentar.