Tutorial práctico de sed: sustituciones y borrado de líneas con direcciones

DUGLAS MORENODUGLAS MORENO 👁 30

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 d y 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 como inicio,fin.
  • Comando: la acción a ejecutar (s para sustitución, d para borrar, p para imprimir, etc.).
  • Argumentos: dependen del comando; para s son 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:

  • patron es una expresión regular básica (BRE) que sed intenta encontrar en cada línea.
  • replacement es el texto que lo sustituirá.
  • flags modifican 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:

  1. Cambiar "es" por "ES" en todas las líneas.
  2. 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.

Solución
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ón
sed -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ón
sed '/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

  1. Usá comillas simples alrededor del script de sed para que el shell no interprete los caracteres especiales (como $, *, \[, etc.).
  2. Probá primero sin -i. Ejecutá el comando y verificá la salida en pantalla antes de modificar el archivo original.
  3. Prefirá delimitadores distintos cuando el patrón o el reemplazo contengan la barra diagonal (/). Por ejemplo, s|ruta/antigua|ruta/nueva| evita escapes innecesarios.
  4. Agrupá múltiples órdenes con ; o newline dentro de un mismo script para evitar lanzar varios procesos sed.
  5. Usá la opción -n + p para depurar: mostrís solo las líneas que fueron afectadas.
  6. Documentá tus scripts. Un comentario # dentro del script de sed (se permite si usás -e o un archivo de script) ayuda a futuros lectores.
  7. Guardá una copia de respaldo antes de usar -i. Muchos sistemas permiten crear una copia automática con -i.bak.

Errores comunes

  • Olvidar el g cuando 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 -i sin 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/flags con 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 d y 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!"

Comentarios (0)

Sé el primero en comentar.

Dejá tu comentario