Introducción a Sed
sed (stream editor o editor de flujo) es una herramienta formidable para analizar y transformar texto. Se utiliza frecuentemente para realizar ediciones automatizadas en archivos o flujos de salida. Comencemos con algunas operaciones básicas.
Comprendiendo la sintaxis de Sed
Antes de pasar a los ejemplos, es fundamental entender la estructura básica de los comandos de sed, especialmente el uso de delimitadores y caracteres especiales.
Estructura del comando Sed
La estructura básica de un comando de sustitución en sed es:
sed 's/patrón/reemplazo/flags' nombre_archivo
Desglose de la sintaxis:
s = comando de sustitución (substitute).
/ = delimitador (separa el patrón, el reemplazo y las opciones).
patrón = lo que se desea buscar.
reemplazo = el texto que ocupará su lugar.
flags = opciones adicionales como g (global) o i (insensible a mayúsculas).
Entendiendo los delimitadores: Barra diagonal (/) vs. Barra invertida ()
Barras diagonales (/) como delimitadores:
- Se utilizan para separar las distintas partes del comando de sustitución.
- Formato:
s/buscar/reemplazar/flags.
- Los caracteres
/ no forman parte del texto buscado ni del reemplazo.
- Ejemplo:
s/Hola/Que tal/g significa "sustituye Hola por Que tal de forma global".
Barras invertidas () para escape:
- Se utilizan para escapar caracteres especiales o indicar una interpretación literal.
- Se emplean con comandos como
i\ (insertar) y a\ (añadir).
- Ejemplo:
1i\Primera linea significa "inserta 'Primera linea' antes de la línea 1".
Diferencia clave:
/ = separadores entre las partes del comando.
\ = carácter de escape o terminador de comando.
Primero, cree un nuevo archivo para trabajar:
echo -e "Hello, world\nThis is a test\nHello, labex\nWorld of Linux" > sed_test.txt
Esto crea un archivo llamado sed_test.txt con cuatro líneas de texto.
Ahora, usemos sed para reemplazar texto:
sed 's/Hello/Hi/' sed_test.txt
Desglose de este comando:
s = comando de sustitución.
- Primera
/ = inicia el patrón de búsqueda.
Hello = el texto a buscar.
- Segunda
/ = separa el patrón del reemplazo.
Hi = el texto de reemplazo.
- Tercera
/ = finaliza el reemplazo.
Este comando reemplaza la primera aparición de "Hello" por "Hi" en cada línea. Por defecto, sed solo actúa sobre la primera coincidencia que encuentra en cada línea.
Nota: En este ejemplo, como "Hello" solo aparece una vez por línea, parece que se reemplazan todas las instancias incluso sin la opción g.
Para entender mejor el efecto de la opción g (global), modifiquemos sed_test.txt para que haya varias apariciones de "Hello" en la misma línea:
echo -e "Hello, world. Hello everyone\nThis is a test\nHello, labex says Hello\nWorld of Linux" > sed_test.txt
Ahora, el contenido de sed_test.txt es:
Hello, world. Hello everyone
This is a test
Hello, labex says Hello
World of Linux
Ejecute el comando de sustitución nuevamente sin la opción g:
sed 's/Hello/Hi/' sed_test.txt
La salida será:
Hi, world. Hello everyone
This is a test
Hi, labex says Hello
World of Linux
Podrá observar que solo el primer "Hello" de cada línea ha sido reemplazado.
Ahora, realice una sustitución global usando la opción g:
sed 's/Hello/Hi/g' sed_test.txt
La salida será:
Hi, world. Hi everyone
This is a test
Hi, labex says Hi
World of Linux
Esta vez, todas las apariciones de "Hello" en cada línea han sido sustituidas por "Hi".
Explicación detallada:
sed 's/Hello/Hi/': Reemplaza la primera coincidencia de "Hello" en cada línea.
- Estructura:
s (sustituir) + /Hello/ (patrón) + Hi/ (reemplazo).
sed 's/Hello/Hi/g': Reemplaza todas las coincidencias de "Hello" en cada línea.
- La
g significa "global", indicando que la sustitución debe aplicarse a cada aparición dentro de la misma línea.
Uso de delimitadores alternativos:
Puede usar otros caracteres como delimitadores si su texto contiene barras diagonales (como en las rutas de archivos). Por ejemplo:
sed 's#/path/to/file#/new/path#g' filename
Aquí, se usa # como delimitador en lugar de /, lo cual facilita mucho la lectura cuando se trabaja con rutas de directorios.
Tenga en cuenta que estos comandos no modifican el archivo original; solo imprimen el resultado en la terminal. Para editar el archivo directamente (in-place), utilice la opción -i:
sed -i 's/Hello/Hi/g' sed_test.txt
Ahora, verifique el contenido del archivo para confirmar los cambios:
cat sed_test.txt