CodeGym /Cursos /Docker SELF /Transformación de texto con sed

Transformación de texto con sed

Docker SELF
Nivel 8 , Lección 1
Disponible

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 que sed 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.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION