← Blog

Sed — Transformación de Texto por Líneas (Stream Editor)

Edición de flujo con sed: sustitución global y condicionada, borrado por patrón/rango, inserciones, -i in-place, -E regex extendida y pipelines de limpieza de salida.

1. Operational Scope & Technical Objective

sed es un editor de flujo que procesa texto línea por línea de forma no interactiva: sustituciones, borrados, inserciones y transformaciones en pipelines. Su valor operativo: normalizar salidas de herramientas (quitar cabeceras, separar campos, limpiar logs) sin tocar ficheros originales, o editar en masa con -i cuando la reescritura es segura. Es el complemento natural de grep en cualquier cadena de procesamiento de salidas.

2. High-Impact Syntax & Command Cheatsheet

# Sintaxis general
sed 'comando' archivo.txt
# comando más común: s/patrón/reemplazo/
#   s          -> sustitución
#   patrón     -> regex (BRE por defecto)
#   reemplazo  -> texto de sustitución
#   sin modif. -> solo la PRIMERA ocurrencia por línea
#   g          -> global (todas las ocurrencias)
#   número     -> solo la ocurrencia número n

sed 's/ex/ex1/' text.txt          # primera ocurrencia de cada línea
sed 's/ex/ex1/g' text.txt         # todas las ocurrencias
sed 's/ex/ex1/3' text.txt         # solo la 3ª ocurrencia por línea

# Sustitución condicionada a que la línea case con un patrón
sed '/ee/ s/Suite/Ste/g' sample.txt
#   /ee/  -> solo líneas que contengan 'ee'; en ellas, reemplaza 'Suite' por 'Ste'

# Líneas específicas y borrado
sed '$s/Suite/Ste/' sample.txt    # $ = última línea
sed '/Suite/d' sample.txt         # borra las líneas que contienen 'Suite'
sed '2,5d' sample.txt             # borra de la línea 2 a la 5

# Fin de línea y separadores
sed 's/$/\n/' sample.txt          # añade salto de línea al final de cada línea
sed 's/,/\n/g' sample.txt         # sustituye comas por saltos de línea
sed -e 's/$/\n/g' -e 's/,/\n/g' sample.txt   # -e: múltiples expresiones en una pasada

# Encadenar con pipes (equivalente a -e en una sola pasada)
sed 's/$/\n/g' sample.txt | sed 's/,/\n/g'

# Guardar en el fichero directamente (in-place)
sed -i 's/Suite/Ste/g' sample.txt
#   -i      -> edición en el archivo
#   En BSD/macOS: sed -i '' '...' (requiere argumento vacío)

Producción: limpieza de texto

sed 's/^[ \t]*//' file.txt        # elimina espacios al inicio de cada línea
sed 's/[ \t]*$//' file.txt        # elimina espacios al final de cada línea
sed -E 's/(foo|bar)/baz/g' file.txt   # -E: regex extendida, agrupación (foo|bar)

Resumen de opciones

s/…/…/ sustitución · g global · /patrón/d borrado · n,n rango · $ última línea · -i in-place · -e múltiples expresiones · -E regex extendida.

3. Real-World Offensive/Defensive Scenarios

Normalización de salidas de herramientas. La salida de un escáner o de un volcado llega con cabeceras, comillas y campos extra; sed -E 's/^[ \t]*//' + s/.*,(.*)/\1/ + grep -v '^#' dejan solo lo accionable para la siguiente fase (alimentar wordlists, cut, sort -u).

Sanear ficheros de configuración al vuelo. Antes de inyectar un fichero en un servicio o de parsear un backup, sed 's/[\r\n]//g' normaliza saltos de línea y sed 's/;.*$//' elimina comentarios — el texto queda en el formato exacto que el parser espera, sin ediciones manuales.

Edición masiva segura. sed -i reescribe en sitio (p. ej. rotar un dominio embebido en configs, cambiar un puerto en múltiples ficheros). El riesgo es el patrón: siempre probar primero en stdout sin -i y usar -E con agrupaciones cuando la regex lo requiera.

Defensa (logs). Sed permite pseudonimizar dumps antes de compartirlos (reemplazar IPs sed -E 's/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/<IP>/g'), manteniendo la estructura del log sin filtrar datos sensibles.