Edición de flujo en Linux

LinuxLinuxBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

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.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux/BasicSystemCommandsGroup -.-> linux/echo("Text Display") linux/BasicFileOperationsGroup -.-> linux/cat("File Concatenating") linux/TextProcessingGroup -.-> linux/sed("Stream Editing") subgraph Lab Skills linux/echo -.-> lab-271375{{"Edición de flujo en Linux"}} linux/cat -.-> lab-271375{{"Edición de flujo en Linux"}} linux/sed -.-> lab-271375{{"Edición de flujo en Linux"}} end

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:

  • s es el comando de sustitución
  • pattern es el texto que quieres reemplazar
  • replacement es el nuevo texto
  • filename es 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 directa 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:

  1. Editar archivos directamente con la opción -i
  2. 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:

  1. Creará una copia de seguridad de sample.txt como sample.txt.bak
  2. 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:

  1. Usar diferentes delimitadores
  2. Usar rangos de direcciones para apuntar a líneas específicas
  3. 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:

  1. Organizar múltiples comandos sed
  2. Agregar comentarios para explicar lo que hace cada comando
  3. 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:

  1. Reemplaza todas las apariciones de "Linux" con "Ubuntu"
  2. Reemplaza todas las apariciones de "user" con "developer"
  3. Reemplaza todas las apariciones de "system" con "platform"
  4. 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 sed para 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.