Introducción
Bienvenido al laboratorio de edición de flujo de Linux. En este laboratorio, aprenderá cómo utilizar sed (Editor de flujo), una poderosa utilidad de línea de comandos para analizar y transformar texto. sed se utiliza para realizar transformaciones básicas de texto en un flujo de entrada (un archivo o entrada de una tubería).
Al final de este laboratorio, podrá:
- Realizar sustituciones básicas de texto con
sed - Editar archivos directamente utilizando
sed - Aplicar sustituciones globales en archivos enteros
- Utilizar técnicas avanzadas de procesamiento de texto
Las habilidades que aprenda le ayudarán a manipular eficientemente archivos y flujos de texto, lo cual es esencial para diversas tareas de administración de sistemas y procesamiento de texto en Linux.
Uso básico de sed y sustitución de texto
En este paso, aprenderemos los conceptos básicos de sed y cómo realizar sustituciones de texto simples. El comando sed es una poderosa herramienta de procesamiento de texto que te permite buscar, encontrar y reemplazar, insertar y eliminar texto en archivos sin abrirlos en un editor.
Primero, verifiquemos que sed esté instalado en nuestro sistema ejecutando:
which sed
Deberías ver una salida similar a:
/usr/bin/sed
Esto confirma que sed está disponible. Si por alguna razón no está instalado, puedes instalarlo con:
sudo apt-get update
sudo apt-get install -y sed
Ahora, creemos un archivo de texto con el que trabajar. Crearemos un archivo llamado sample.txt en el directorio actual:
echo "Linux is a powerful operating system." > ~/project/sample.txt
echo "Many users prefer Linux for servers." >> ~/project/sample.txt
echo "Linux has strong security features." >> ~/project/sample.txt
Examinemos el contenido de nuestro nuevo archivo:
cat ~/project/sample.txt
Deberías ver:
Linux is a powerful operating system.
Many users prefer Linux for servers.
Linux has strong security features.
Ahora, usemos sed para realizar una sustitución básica. El siguiente comando reemplazará la primera aparición de "Linux" con "Ubuntu" en cada línea:
sed 's/Linux/Ubuntu/' ~/project/sample.txt
Deberías ver:
Ubuntu is a powerful operating system.
Many users prefer Ubuntu for servers.
Ubuntu has strong security features.
Observa que sed imprimió el texto modificado en la salida estándar (tu terminal), pero el archivo original permanece sin cambios. Puedes verificar esto ejecutando:
cat ~/project/sample.txt
La salida aún debe mostrar "Linux" y no "Ubuntu":
Linux is a powerful operating system.
Many users prefer Linux for servers.
Linux has strong security features.
La sintaxis básica para la sustitución con sed es:
sed 's/pattern/replacement/' filename
Donde:
ses el comando de sustituciónpatternes el texto que quieres reemplazarreplacementes el nuevo textofilenamees el archivo de entrada
Intentemos otro ejemplo. Esta vez, reemplazaremos "powerful" con "versatile":
sed 's/powerful/versatile/' ~/project/sample.txt
Esto debería mostrar la siguiente salida:
Linux is a versatile operating system.
Many users prefer Linux for servers.
Linux has strong security features.
Edición in-place y sustitución global
En el paso anterior, aprendimos cómo usar sed para la sustitución básica de texto, pero los cambios solo se mostraron en la pantalla y no se guardaron en el archivo. En este paso, aprenderemos cómo:
- Editar archivos directamente con la opción
-i - Realizar sustituciones globales utilizando la bandera
g
Edición directa
Para realizar cambios permanentes en un archivo utilizando sed, usamos la opción -i. Esta opción modifica el archivo directamente en lugar de simplemente imprimir la salida en el terminal.
Modifiquemos nuestro archivo sample.txt reemplazando "Linux" con "Ubuntu":
sed -i 's/Linux/Ubuntu/' ~/project/sample.txt
A diferencia del paso anterior, este comando no produce ninguna salida visible. Veamos el contenido del archivo para ver si ha cambiado:
cat ~/project/sample.txt
Ahora deberías ver:
Ubuntu is a powerful operating system.
Many users prefer Ubuntu for servers.
Ubuntu has strong security features.
¡Los cambios se han guardado en el archivo! Esta es la potencia de la edición directa con sed.
Sustitución global
Por defecto, sed solo reemplaza la primera aparición del patrón en cada línea. Para reemplazar todas las apariciones, usamos la bandera g (global) al final del comando de sustitución.
Creemos un nuevo archivo con texto repetido:
echo "The red car stopped at the red light near the red building." > ~/project/colors.txt
Ahora, usemos sed sin la bandera global para reemplazar "red" con "blue":
sed 's/red/blue/' ~/project/colors.txt
Deberías ver:
The blue car stopped at the red light near the red building.
Observa que solo la primera aparición de "red" se reemplazó con "blue". Ahora, usemos la bandera global:
sed 's/red/blue/g' ~/project/colors.txt
La salida debería ser:
The blue car stopped at the blue light near the blue building.
¡Todas las apariciones de "red" se han reemplazado con "blue"!
Apliquemos esto a nuestro archivo sample.txt. Primero, agreguemos más apariciones de "Ubuntu":
echo "Ubuntu is great. I use Ubuntu daily for my work with Ubuntu tools." >> ~/project/sample.txt
Ahora, reemplacémos todas las apariciones de "Ubuntu" con "Linux" usando la bandera global y la edición directa:
sed -i 's/Ubuntu/Linux/g' ~/project/sample.txt
Verifiquemos los cambios:
cat ~/project/sample.txt
Deberías ver:
Linux is a powerful operating system.
Many users prefer Linux for servers.
Linux has strong security features.
Linux is great. I use Linux daily for my work with Linux tools.
Todas las apariciones de "Ubuntu" se han reemplazado con "Linux" en todo el archivo.
Crear una copia de seguridad antes de la edición directa
Al usar la edición directa, a menudo es una buena práctica crear una copia de seguridad del archivo original. Puedes hacer esto proporcionando una extensión a la opción -i:
sed -i.bak 's/Linux/Ubuntu/g' ~/project/sample.txt
Este comando:
- Creará una copia de seguridad de
sample.txtcomosample.txt.bak - Reemplazará todas las apariciones de "Linux" con "Ubuntu" en
sample.txt
Verifiquemos ambos archivos:
cat ~/project/sample.txt
cat ~/project/sample.txt.bak
El primer comando debería mostrar todas las apariciones de "Linux" reemplazadas con "Ubuntu", mientras que el archivo de copia de seguridad todavía debería contener "Linux".
Comandos avanzados de sed y coincidencia de patrones
Ahora que hemos dominado la sustitución básica y la edición directa con sed, exploremos algunas características más avanzadas:
- Usar diferentes delimitadores
- Usar rangos de direcciones para apuntar a líneas específicas
- Combinar múltiples comandos
Usar diferentes delimitadores
Si bien hemos estado usando la barra inclinada / como delimitador en nuestros comandos de sustitución, sed nos permite usar cualquier carácter como delimitador. Esto es especialmente útil cuando el patrón o el texto de reemplazo contiene barras inclinadas.
Creemos un archivo con rutas de archivos:
echo "/usr/local/bin is in the PATH" > ~/project/paths.txt
echo "My config is in /etc/myapp/config.json" >> ~/project/paths.txt
Si queremos reemplazar /usr/local/bin con /opt/bin, usar barras inclinadas sería confuso:
sed 's/\/usr\/local\/bin/\/opt\/bin/' ~/project/paths.txt
En cambio, podemos usar un delimitador diferente, como #:
sed 's#/usr/local/bin#/opt/bin#' ~/project/paths.txt
¡Esto es mucho más legible! La salida debería ser:
/opt/bin is in the PATH
My config is in /etc/myapp/config.json
Otros delimitadores comunes incluyen |, : y _.
Direccionamiento - Apuntar a líneas específicas
sed nos permite especificar a qué líneas aplicar la sustitución. Esto se hace prefijando el comando con una dirección.
Creemos un nuevo archivo con líneas numeradas:
echo "Line 1: This is the first line." > ~/project/numbered.txt
echo "Line 2: This is the second line." >> ~/project/numbered.txt
echo "Line 3: This is the third line." >> ~/project/numbered.txt
echo "Line 4: This is the fourth line." >> ~/project/numbered.txt
echo "Line 5: This is the fifth line." >> ~/project/numbered.txt
Para reemplazar "line" con "row" solo en la línea 3:
sed '3 s/line/row/' ~/project/numbered.txt
La salida debería ser:
Line 1: This is the first line.
Line 2: This is the second line.
Line 3: This is the third row.
Line 4: This is the fourth line.
Line 5: This is the fifth line.
También podemos especificar un rango de líneas. Para reemplazar "line" con "row" en las líneas 2 a 4:
sed '2,4 s/line/row/' ~/project/numbered.txt
La salida debería ser:
Line 1: This is the first line.
Line 2: This is the second row.
Line 3: This is the third row.
Line 4: This is the fourth row.
Line 5: This is the fifth line.
Otra característica útil es la capacidad de coincidir con líneas basadas en un patrón. Por ejemplo, para reemplazar "line" con "row" solo en las líneas que contengan "third" o "fourth":
sed '/\(third\|fourth\)/ s/line/row/' ~/project/numbered.txt
La salida debería ser:
Line 1: This is the first line.
Line 2: This is the second line.
Line 3: This is the third row.
Line 4: This is the fourth row.
Line 5: This is the fifth line.
Combinar múltiples comandos
Podemos combinar múltiples comandos sed usando la opción -e o separando los comandos con punto y coma.
Reemplacemos "first" con "1st", "second" con "2nd" y "third" con "3rd" en un solo comando:
sed -e 's/first/1st/' -e 's/second/2nd/' -e 's/third/3rd/' ~/project/numbered.txt
Alternativamente, podemos usar punto y coma:
sed 's/first/1st/; s/second/2nd/; s/third/3rd/' ~/project/numbered.txt
Ambos comandos deberían producir la misma salida:
Line 1: This is the 1st line.
Line 2: This is the 2nd line.
Line 3: This is the 3rd line.
Line 4: This is the fourth line.
Line 5: This is the fifth line.
Ahora hagamos estos cambios permanentes:
sed -i 's/first/1st/; s/second/2nd/; s/third/3rd/' ~/project/numbered.txt
Y verifiquemos los cambios:
cat ~/project/numbered.txt
Deberías ver el texto actualizado con números ordinales.
Trabajando con scripts de sed
En los pasos anteriores, hemos estado ejecutando comandos sed directamente desde la línea de comandos. Sin embargo, para operaciones más complejas, a menudo es más conveniente crear un archivo de script de sed. Esto nos permite:
- Organizar múltiples comandos
sed - Agregar comentarios para explicar lo que hace cada comando
- Reutilizar las mismas operaciones en diferentes archivos
Crear un script de sed
Creemos un simple script de sed que realice varias transformaciones de texto:
cat > ~/project/transform.sed << 'EOF'
## Replace "Linux" with "Ubuntu"
s/Linux/Ubuntu/g
## Replace "user" with "developer"
s/user/developer/g
## Replace "system" with "platform"
s/system/platform/g
## Convert "is" to uppercase
s/is/IS/g
EOF
Este script realiza cuatro sustituciones:
- Reemplaza todas las apariciones de "Linux" con "Ubuntu"
- Reemplaza todas las apariciones de "user" con "developer"
- Reemplaza todas las apariciones de "system" con "platform"
- Convierte todas las apariciones de "is" a mayúsculas "IS"
Creemos un nuevo archivo para probar nuestro script:
cat > ~/project/test.txt << 'EOF'
Linux is a powerful operating system.
The user interface is very customizable.
Many Linux users prefer the command-line interface.
The system resources are efficiently managed.
EOF
Ejecutar un script de sed
Para ejecutar nuestro script de sed en el archivo de prueba, usamos la opción -f:
sed -f ~/project/transform.sed ~/project/test.txt
Deberías ver:
Ubuntu IS a powerful operating platform.
The developer interface IS very customizable.
Many Ubuntu developers prefer the command-line interface.
The platform resources are efficiently managed.
¡Todas las sustituciones de nuestro script se han aplicado!
Edición directa con un script
Al igual que con los comandos sed de la línea de comandos, podemos usar la opción -i para realizar una edición directa con un script:
sed -i -f ~/project/transform.sed ~/project/test.txt
Verifiquemos los cambios:
cat ~/project/test.txt
El archivo ahora debería contener el texto transformado.
Crear una copia de seguridad con un script
Y una vez más, podemos crear una copia de seguridad antes de realizar cambios:
## First, let's restore the original content
cat > ~/project/test.txt << 'EOF'
Linux is a powerful operating system.
The user interface is very customizable.
Many Linux users prefer the command-line interface.
The system resources are efficiently managed.
EOF
## Now run sed with a backup
sed -i.bak -f ~/project/transform.sed ~/project/test.txt
Veamos tanto el archivo modificado como la copia de seguridad:
cat ~/project/test.txt
cat ~/project/test.txt.bak
El primer comando debería mostrar el texto transformado, mientras que el archivo de copia de seguridad debería contener el texto original.
Aplicar un script de sed a múltiples archivos
Una de las ventajas de usar un script de sed es que podemos aplicar fácilmente las mismas transformaciones a múltiples archivos.
Creemos algunos archivos de prueba más:
## Create test1.txt
cat > ~/project/test1.txt << 'EOF'
Linux offers excellent system performance.
Many users appreciate its stability.
EOF
## Create test2.txt
cat > ~/project/test2.txt << 'EOF'
The Linux community provides great support.
New users can find helpful resources online.
EOF
## Create test3.txt
cat > ~/project/test3.txt << 'EOF'
The system updates are well-managed in Linux.
Users can customize their experience.
EOF
Ahora, apliquemos nuestro script de sed a todos estos archivos a la vez:
sed -i -f ~/project/transform.sed ~/project/test1.txt ~/project/test2.txt ~/project/test3.txt
Verifiquemos los cambios:
cat ~/project/test1.txt
cat ~/project/test2.txt
cat ~/project/test3.txt
Los tres archivos deberían mostrar el texto transformado según nuestro script.
Esto demuestra el poder de los scripts de sed para el procesamiento por lotes de múltiples archivos con el mismo conjunto de transformaciones.
Resumen
En este laboratorio, has aprendido cómo usar sed, el Editor de Flujo (Stream Editor), para manipular archivos de texto en Linux. Has adquirido experiencia práctica en varios aspectos importantes de sed:
- Sustitución básica de texto utilizando el comando
s - Edición directa con la opción
-i - Sustitución global con la bandera
g - Creación de copias de seguridad antes de editar con la opción
-i.bak - Uso de diferentes delimitadores para patrones de sustitución
- Apuntar a líneas específicas con direcciones y rangos
- Creación y ejecución de scripts de
sedpara operaciones más complejas - Aplicación de transformaciones a múltiples archivos a la vez
Estas habilidades son esenciales para el procesamiento eficiente de texto en entornos Linux. La capacidad de manipular archivos de texto sin abrirlos en un editor es especialmente valiosa para administradores de sistemas, desarrolladores y analistas de datos que a menudo necesitan procesar grandes volúmenes de datos de texto o realizar cambios sistemáticos en múltiples archivos.
A medida que continúes trabajando con Linux, descubrirás que sed es una herramienta indispensable en tu conjunto de herramientas de procesamiento de texto, junto con otras utilidades como grep, awk y cut.



