martes, 12 de noviembre de 2024

Introducción a Regular Expressions: El comando sed

El comando sed es una herramienta poderosa en Linux para realizar modificaciones de texto automáticas. Con el uso de expresiones regulares (regex), sed permite realizar reemplazos y modificaciones complejas en archivos de texto, haciendo que el trabajo sea más eficiente y preciso.

En el primer post de ésta serie nos enfocamos en el comando grep, puedes verlo aquí. Nuestra guía y referencia de estudio es éste cheatsheet (conocidos como chuleta o chivo, en español) y como texto objetivo usaremos el poema Hay Un País en el Mundo, del poeta nacional (dominicano) Pedro Mir (1913-2000).

El comando sed.

Leemos en Wikipedia que sed (abreviatura de stream editor) "es un editor de flujo, una potente herramienta de tratamiento de texto para el sistema operativo Unix que acepta como entrada un archivo, lo lee y modifica línea a línea de acuerdo a un script, mostrando el resultado por salida estándar (normalmente en pantalla, a menos que se realice una redirección)."

sed soporta expresiones regulares (regex), que son patrones de búsqueda flexibles. Esto permite realizar reemplazos, extracciones, y otras operaciones complejas basadas en coincidencias de patrones. Las regex en sed son especialmente útiles para manejar textos grandes y realizar cambios precisos.

Sintaxis básica de sed con regex:
$ sed [opciones] 's/patrón/reemplazo/' archivo_de_texto
Para reemplazar cualquier palabra que termine en "ndo" con la palabra "SONANDO":
$ sed 's/\b\w*ndo\b/SONANDO/g' hay-un-pais-en-el-mundo.txt
  • \b: Define un límite de palabra.
  • \w*: Coincide con cualquier palabra.
  • g: Realiza el reemplazo en todas las ocurrencias en cada línea.

Eliminar líneas que comienzan con una vocal:
$ sed '/^[AEIOUaeiou]/d' hay-un-pais-en-el-mundo.txt
Extraer solo líneas con palabras de más de 7 letras:
$ sed -n '/\b\w\{7,\}\b/p' hay-un-pais-en-el-mundo.txt
  • \w\{7,\}: Coincide con palabras de al menos 7 caracteres.
  • p: Imprime solo las líneas coincidentes.

Puedes agregar una frase al final de cada línea que contenga la palabra "mundo", usando:
$ sed '/mundo$/ s/$/ - Reflejo de realidad/' hay-un-pais-en-el-mundo.txt
  • /mundo$/: Coincide con líneas que terminan en "mundo".
  • s/$/ - Reflejo de realidad/: Añade " - Reflejo de realidad" al final de la línea.

Si deseas resaltar palabras en las que una misma letra se repite consecutivamente, puedes usar el siguiente comando:
$ sed -r 's/\b(\w*([a-zA-Z])\2\w*)\b/*\1*/g' hay-un-pais-en-el-mundo.txt 
  • (\w*([a-zA-Z])\2\w*): Coincide con palabras donde al menos una letra está repetida consecutivamente.
  • *: Resalta las palabras envolviéndolas entre asteriscos..


Opciones útiles de sed para regex

  • -r: Usa expresiones regulares extendidas, lo cual simplifica patrones regex.
  • -i: Edita el archivo en su lugar (normalmente las modificaciones solo son visibles en la salida estándar (stdout), guardando los cambios directamente.


Usar sed con regex abre un abanico de posibilidades para realizar manipulaciones avanzadas en archivos de texto. A través de estos ejemplos aplicados al poema, es fácil ver cómo las expresiones regulares permiten transformar y adaptar texto de forma detallada y eficiente.

Puedes profundizar más sobre el comando sed al consultar su manual:

$ man sed

No hay comentarios:

Publicar un comentario