Transformación de texto con sed
1. Sintaxis del comando sed
¿Qué es sed
?
sed
(abreviatura de Stream Editor, o sea editor de flujo) es una utilidad poderosa para procesar texto, que te permite modificar, agregar, eliminar o transformar líneas en archivos de texto y flujos de datos.
La magia principal de sed
está en que edita texto "al vuelo", sin tocar el archivo original (a menos que tú se lo pidas). Esto lo convierte en una herramienta ideal para transformaciones rápidas y automáticas de datos.
Sintaxis básica del comando
Tomemos la fórmula principal para trabajar con sed
:
sed [opciones] 'patrón/acción' archivo
Donde:
patrón
— es el texto o la expresión regular que se busca.acción
— la operación que quieres realizar (por ejemplo, reemplazo de texto).archivo
— el archivo de texto que contiene las líneas que deseas modificar.
Para simplificar al principio, nos centraremos en las acciones más populares: reemplazar texto (s
— de la palabra "substitute") y eliminar líneas (d
— de la palabra "delete").
2. Sustitución de texto s/viejo/nuevo/
Ejemplo 1: Sustitución simple de texto
Supongamos que tienes un archivo example.txt
con el siguiente contenido:
Hello world!
Welcome to Linux.
Linux is awesome.
Intentemos reemplazar la palabra "Linux" con sed
:
sed 's/Linux/sed/' example.txt
El resultado será el siguiente:
Hello world!
Welcome to sed.
sed is awesome.
Eso es todo. La palabra "Linux" se reemplazó por sed
solo una vez en cada línea. Este es el comportamiento estándar.
Ejemplo 2: Sustitución global
Si necesitas reemplazar todas las ocurrencias de la palabra en lugar de solo la primera en la línea, añade el flag g
(global):
sed 's/Linux/sed/g' example.txt
Si en la línea hay varias menciones a "Linux", todas serán reemplazadas por sed
.
Ejemplo 3: Ignorar mayúsculas y minúsculas
Para reemplazar texto sin tener en cuenta mayúsculas y minúsculas, añade el flag I
(o i
, dependiendo de tu versión):
sed 's/linux/sed/gi' example.txt
Esto reemplazará palabras como "Linux", "LINUX", "LiNuX", etc.
Ejemplo 4: Sustitución con guardado del resultado
Por defecto, sed
simplemente imprime el resultado en la consola sin modificar el archivo. Si deseas guardar los cambios en el archivo, añade la opción -i
(in-place):
sed -i 's/Linux/sed/g' example.txt
Ahora el archivo example.txt
se actualizará con los cambios.
3. Eliminación de líneas /patrón/d
Ejemplo 1: Eliminación de líneas por patrón
Si quieres eliminar todas las líneas que contienen la palabra "Linux":
sed '/Linux/d' example.txt
El resultado será:
¡Hola mundo!
Aquí se eliminaron las líneas donde aparece "Linux".
Eliminación de líneas por número
Puedes eliminar una línea por su número. Por ejemplo, para eliminar la segunda línea, usamos:
sed '2d' example.txt
El resultado:
¡Hola mundo!
Linux es impresionante.
Eliminación de varias líneas: indica un rango, por ejemplo, elimina las líneas de la 2ª a la 3ª:
sed '2,3d' example.txt
4. Trabajo con expresiones regulares
¡Aquí es donde sed
brilla con su potencia! En los patrones, puedes usar expresiones regulares para buscar coincidencias más complejas.
Ejemplo 1: Sustitución de palabras con un patrón específico
Supongamos que en el texto hay líneas:
error: something went wrong
warning: check your system
error: unable to connect
Queremos reemplazar todas las líneas que comienzan con "error" por "Issue Detected". Aquí es donde las expresiones regulares son útiles:
sed 's/^error:.*/Issue Detected/' logs.txt
Dónde:
^
— indica el inicio de la línea..*
— significa "cualquier cosa que venga después".
Resultado:
Issue Detected
warning: check your system
Issue Detected
5. Inserción y adición de líneas
Insertar una línea antes de una coincidencia
Para insertar una línea antes de cada línea que contenga "Linux":
sed '/Linux/i\# Aprender es divertido' example.txt
Resultado:
Hello world!
Welcome to Linux.
# Aprender es divertido
Linux is awesome.
Ejemplo 2: Agregar una línea después de una coincidencia
Para agregar texto después de una línea con un patrón:
sed '/Linux/a\# sed lo hace más fácil' example.txt
Resultado:
Hello world!
Welcome to Linux.
# sed lo hace más fácil
Linux is awesome.
# sed lo hace más fácil
6. Práctica: manejo de archivos de configuración
Vamos a resolver un problema práctico. Imagínate que tienes un archivo de configuración, config.txt
:
host=localhost
port=8080
mode=production
logfile=/var/log/app.log
Tarea 1: Sustituir "localhost" por "127.0.0.1"
sed -i 's/localhost/127.0.0.1/' config.txt
Resultado:
host=127.0.0.1
port=8080
mode=production
logfile=/var/log/app.log
Tarea 2: Incrementar el puerto en 1
Para esto usamos sed
con un pequeño truco:
sed -i 's/port=8080/port=8081/' config.txt
Resultado:
host=127.0.0.1
port=8081
mode=production
logfile=/var/log/app.log
Tarea 3: Eliminar líneas con logfile
Si la configuración ya no requiere logs, eliminamos la línea:
sed -i '/logfile/d' config.txt
Resultado:
host=127.0.0.1
port=8081
mode=production
7. Combinación con otros comandos
sed
funciona de maravilla junto con otras herramientas de Linux. Por ejemplo:
grep "error" logs.txt | sed 's/error/ERROR/'
Aquí primero buscamos líneas con errores, y luego las formateamos.
Errores típicos y cómo evitarlos
- Error: olvidaste la opción
-i
. Los principiantes a menudo esperan quesed
modifique el archivo, pero no añaden-i
. No olvides especificarlo explícitamente si quieres hacer cambios en el archivo. - Error: las comillas. En algunos sistemas, especialmente si se usan comillas simples,
\
antes de caracteres especiales puede no funcionar correctamente. Asegúrate siempre de escapar los caracteres correctamente. - Error con rangos de líneas. Si usas rangos (por ejemplo,
2,3d
), asegúrate de que están especificados correctamente — el archivo no debe estar vacío.
GO TO FULL VERSION