Introducción
El sed
comando “Editor de Streams” en Linux es una potente utilidad para la manipulación de texto. Permite a los usuarios realizar diversas operaciones, como buscar, reemplazar, insertar y eliminar texto en archivos. Este tutorial ofrece una guía completa para dominar el sed
comando con ejemplos prácticos, explicaciones de sintaxis y casos de uso avanzados.
¿Qué es el comando sed?
El sed
comando es un editor de flujo que procesa texto línea por línea. Esto permite modificar el contenido del archivo sin abrirlo directamente en un editor de texto. Se usa ampliamente en scripts de shell y administración de sistemas para automatizar las tareas de procesamiento de texto.
Características principales de sed
1. Coincidencia y reemplazo de patrones 2. Edición de archivos en el lugar 3. Filtrado y manipulación de texto 4. Compatibilidad con expresiones regulares 5. Operaciones multilínea
Sintaxis básica del sed
comando
La sintaxis básica del sed
comando consta de tres componentes principales: las opciones del comando, un script que define las instrucciones de edición y el archivo que se va a procesar.
Esta estructura permite a los usuarios especificar el comportamiento del comando, definir las transformaciones de texto y aplicarlas al archivo deseado.
- Opciones de comando : Se utilizan para especificar el comportamiento del comando. Por ejemplo, esta
-i
opción se utiliza para la edición in situ de archivos, es decir, para sobrescribirlos. - Script : El script define las instrucciones de edición. Puede estar entre comillas simples (
'
) o dobles ("
). Puede contener uno o más comandos de edición, separados por punto y coma (;
). - Archivo de entrada : Este es el archivo que se procesará. Puede ser un solo archivo o una lista de archivos separados por espacios. Si no se especifica ningún archivo,
sed
se lee desde la entrada estándar.
La sintaxis básica del sed
comando es la siguiente:
sed [options] 'script' file
En esta sintaxis, sed
es el comando, [options]
son las opciones del comando, 'script'
contiene los comandos de edición y file
es el archivo que se va a procesar.
sed [options] 'script' file
Lo entenderás mejor con los ejemplos que aparecen a continuación.
sed 's/hello/world/' sample.txt
Esto reemplaza la primera aparición de “hola” con “mundo” en cada línea de sample.txt
.
Opciones de uso común ensed
Opción | Descripción | Ejemplo |
---|---|---|
-i | Edición in situ | sed -i 's/old/new/' file.txt |
-n | Suprimir la impresión automática | sed -n '/pattern/p' file.txt |
-e | Ejecutar múltiples comandos | sed -e 's/old/new/' -e '/pattern/d' file.txt |
-f | Leer comandos de un archivo | sed -f script.sed file.txt |
-r | Utilice expresiones regulares extendidas | sed -r 's/old/new/' file.txt |
-E | Utilice expresiones regulares extendidas (similares a -r ) | sed -E 's/old/new/' file.txt |
-z | Separar líneas con carácter NUL | sed -z 's/old/new/' file.txt |
-l | Especifique la longitud de línea para el comando ‘l’ | sed -l 100 'l' file.txt |
-b | Modo binario (no elimine los caracteres CR) | sed -b 's/old/new/' file.txt |
Casos de uso más comunes desed
A continuación se muestran algunos de los casos de uso más prácticos del sed
comando.
Primero, creemos un archivo de texto de muestra file1.txt
y escribamos en él el siguiente texto, para facilitar la comprensión y el seguimiento.
cat > file1.txt
Copie y pegue el siguiente texto:
Linux is a family of free and open-source operating systems based on the Linux kernel.
Operating systems based on Linux are known as Linux distributions or distros.
Examples include Debian, Ubuntu, Fedora, CentOS, Gentoo, Arch Linux, and many others.
Buscar y reemplazar
En el siguiente comando, s
se especifica la operación de sustitución y /
son delimitadores. /Linux/
Es el patrón de búsqueda y Unix
es la cadena de reemplazo.
Nota: De forma predeterminada, el sed
comando solo reemplaza la primera aparición del patrón en cada línea y no reemplazará la segunda o tercera aparición en la línea.
sed 's/Linux/Unix/' file1.txt
Este comando reemplaza la primera aparición de “Linux” con “Unix” en cada línea.
Producción:
OutputUnix is a family of free and open-source operating systems based on the Linux kernel.
Operating systems based on Unix are known as Linux distributions or distros.
Examples include Debian, Ubuntu, Fedora, CentOS, Gentoo, Arch Unix, and many others.
Reemplazar globalmente en cada línea
La bandera de sustitución /g
(reemplazo global) especifica el sed
comando para reemplazar todas las ocurrencias de la cadena en la línea.
sed 's/Linux/Unix/g' file1.txt
Este comando reemplaza todas las apariciones de “Linux” con “Unix” en cada línea.
Producción:
OutputUnix is a family of free and open-source operating systems based on the Unix kernel.
Operating systems based on Unix are known as Unix distributions or distros.
Examples include Debian, Ubuntu, Fedora, CentOS, Gentoo, Arch Unix, and many others.
Edición en el lugar
La opción `-i` permite la edición in situ del archivo. En pocas palabras, lo sobrescribe.
sed -i 's/Linux/Unix/' file1.txt
Este comando edita el archivo en su lugar, reemplazando “Linux” por “Unix” directamente en file1.txt
. Sin -i
, la inserción solo ocurre en la salida y no modifica el contenido del archivo. Para que el cambio sea persistente, debe usar la -i
opción.
Eliminar líneas específicas
sed '2d' file1.txt
Este comando eliminará la segunda línea de file1.txt
.
Producción:
OutputUnix is a family of free and open-source operating systems based on the Linux kernel.
Examples include Debian, Ubuntu, Fedora, CentOS, Gentoo, Arch Unix, and many others.
Imprimir líneas específicas
Suprime la -n
impresión automática del espacio de patrón y p
es el comando de impresión.
sed -n '1,2p' file1.txt
Este comando imprime las líneas 1 a 2 de file1.txt
.
Producción:
OutputUnix is a family of free and open-source operating systems based on the Unix kernel.
Operating systems based on Unix are known as Unix distributions or distros.
Eliminar líneas que coinciden con un patrón
Las /pattern/
líneas coincidentes que contienen el patrón y la d
bandera eliminan las líneas coincidentes.
sed '/kernel/d' file1.txt
Este comando eliminará todas las líneas que contengan la palabra “kernel”.
Producción:
OutputOperating systems based on Unix are known as Unix distributions or distros.
Examples include Debian, Ubuntu, Fedora, CentOS, Gentoo, Arch Unix, and many others.
Sustituir con un archivo de respaldo
El siguiente comando reemplazará todas las instancias de “Unix” por “Linux” y creará un archivo de respaldo con el file1.txt.bak
nombre del archivo anterior antes de reemplazarlo. Esto -i.bak
permite la edición in situ y crea un archivo de respaldo.
sed -i.bak 's/Unix/Linux/g' file1.txt
Producción:
OutputLinux is a family of free and open-source operating systems based on the Linux kernel.
Operating systems based on Linux are known as Linux distributions or distros.
Examples include Debian, Ubuntu, Fedora, CentOS, Gentoo, Arch Linux, and many others.
Y aquí está el contenido del archivo de respaldo file1.txt.bak
.
more file1.txt.bak
OutputUnix is a family of free and open-source operating systems based on the Unix kernel.
Operating systems based on Unix are known as Unix distributions or distros.
Examples include Debian, Ubuntu, Fedora, CentOS, Gentoo, Arch Unix, and many others.
Reemplazar tabulaciones con espacios
El siguiente comando reemplazará cada tabulación con cuatro espacios. La \t
bandera coincide con las tabulaciones y /g
sirve para el reemplazo global en toda la línea.
sed 's/\t/ /g' file1.txt
Producción:
Output Linux is a family of free and open-source operating systems based on the Linux kernel.
Operating systems based on Linux are known as Linux distributions or distros.
Examples include Debian, Ubuntu, Fedora, CentOS, Gentoo, Arch Linux, and many others.
Eliminar líneas vacías
El siguiente comando eliminará todas las líneas vacías de file1.txt
. El /^$
comando “matches” elimina las líneas vacías y /d
las líneas coincidentes.
sed '/^$/d' file1.txt
Puede editar el file1.txt
archivo usando vi
el editor de texto y agregar algunas líneas vacías para probar este comando.
Líneas de impresión que coinciden con un patrón
El siguiente comando imprime solo las líneas que contienen “Ubuntu”.
sed -n '/Ubuntu/p' file1.txt
La -n
opción suprime la impresión automática. /Ubuntu/
Coincide con las líneas que contienen el patrón y p
se imprimen las líneas coincidentes.
Producción:
OutputExample includes Debian, Ubuntu, Fedora, CentOS, Gentoo, Arch Linux, and many others.
Casos de uso avanzados desed
Esta sección consta de algunos casos de uso avanzados y más complicados del sed
comando.
Insertar texto antes de una línea
El siguiente comando inserta “Este es el texto insertado.” antes de la segunda línea en file1.txt
.
sed -i '2i\This is inserted text.' file1.txt
La -i
opción es para edición en el lugar y la 2i\
bandera inserta texto antes de la segunda línea.
Nota: Sin -i
, la inserción solo se produce en la salida y no modifica el contenido del archivo. Para que el cambio sea persistente, debe usar la -i
opción con el sed
comando.
Producción:
OutputLinux is a family of free and open-source operating systems based on the Linux kernel.
This is inserted text.
Operating systems based on Linux are known as Linux distributions or distros.
Example includes Debian, Ubuntu, Fedora, CentOS, Gentoo, Arch Linux, and many others.
Reemplazar la enésima ocurrencia de un patrón en una línea
Use los indicadores /1
o /2
para reemplazar la primera y la segunda aparición de un patrón en una línea. El siguiente comando reemplaza la segunda aparición de la palabra “Linux” por “Unix” en una línea.
sed 's/Linux/Unix/2' file1.txt
Producción:
OutputLinux is a family of free and open-source operating systems based on the Unix kernel.
This is inserted text.
Operating systems based on Linux are known as Unix distributions or distros.
Examples includes Debian, Ubuntu, Fedora, CentOS, Gentoo, Arch Linux, and many others.
Añadir cadena después de una línea
El siguiente comando añade “Este es el texto añadido” después de la tercera línea file1.txt
. Esta -i
opción garantiza que los cambios se guarden y 3a\
añade el texto después de la tercera línea especificada.
sed -i '3a\This is appended text.' file1.txt
Producción:
OutputLinux is a family of free and open-source operating systems based on the Linux kernel.
This is inserted text.
Operating systems based on Linux are known as Linux distributions or distros.
This is appended text.
Example includes Debian, Ubuntu, Fedora, CentOS, Gentoo, Arch Linux, and many others.
Reemplazar una cadena al principio de una línea
La ^<pattern>
bandera se usa para coincidir con un patrón específico al inicio de una línea. El siguiente comando reemplaza «Linux» por «Unix» solo si «Linux» aparece al inicio de una línea.
sed 's/^Linux/Unix/' file1.txt
Producción:
OutputUnix is a family of free and open-source operating systems based on the Linux kernel.
This is inserted text.
Operating systems based on Linux are known as Linux distributions or distros.
This is appended text.
Example includes Debian, Ubuntu, Fedora, CentOS, Gentoo, Arch Linux, and many others.
Reemplazar cadena al final de una línea
El siguiente comando reemplaza “distros.” por “distributions” solo si aparece al final de una línea. La <pattern>$
bandera se usa para hacer coincidir un patrón específico con el final de una línea.
sed 's/distros.$/distributions/' file1.txt
Producción:
OutputLinux is a family of free and open-source operating systems based on the Linux kernel.
This is inserted text.
Operating systems based on Linux are known as Linux distributions or distributions.
This is appended text.
Example includes Debian, Ubuntu, Fedora, CentOS, Gentoo, Arch Linux, and many others.
Reemplazo sin distinción entre mayúsculas y minúsculas
El siguiente comando reemplaza “linux” por “Unix” sin distinguir entre mayúsculas y minúsculas. La I
opción hace que la coincidencia no distinga entre mayúsculas y minúsculas.
sed 's/linux/Unix/I' file1.txt
Extraer líneas entre patrones
El siguiente comando imprime todas las líneas entre “insertado” y “agregado”, inclusive.
sed -n '/inserted/,/appended/p' file1.txt
,
:Operador de rango para hacer coincidir líneas entre dos patrones.p
:Imprime líneas coincidentes.
Y la -n
opción de suprimir la impresión automática de líneas.
Producción:
OutputThis is inserted text.
Operating systems based on Linux are known as Linux distributions or distros.
This is appended text.
Procesar varios archivos
El siguiente comando reemplaza “Linux” con “Unix” en ambos file1.txt
y file2.txt
sobrescribe el archivo.
sed -i 's/Linux/Unix/' file1.txt file2.txt
Formato y numeración de líneas no vacías
El siguiente comando agrega números de línea a líneas no vacías en file1.txt
.
sed '/./=' file1.txt | sed 'N;s/\n/ /'
/./=
: Coincide con líneas que no están vacías y las numera.N
:Agrega la siguiente línea al espacio del patrón.s/\n/ /
: Reemplaza el carácter de nueva línea con un espacio.
Producción:
Output1 Linux is a family of free and open-source operating systems based on the Linux kernel.
2 This is inserted text.
3 Operating systems based on Linux are known as Linux distributions or distros.
4 This is appended text.
5 Example includes Debian, Ubuntu, Fedora, CentOS, Gentoo, Arch Linux, and many others.
Reemplazar cadena en un número de línea específico
Puede restringir el sed
comando para que reemplace la cadena en una línea específica. El siguiente comando reemplaza la cadena “distros” por “distributions” solo en la tercera línea.
sed '3 s/distros/distributions/' file1.txt
Producción:
Linux is a family of free and open-source operating systems based on the Linux kernel.
This is inserted text.
Operating systems based on Linux are known as Linux distributions or distributions.
This is appended text.
Example includes Debian, Ubuntu, Fedora, CentOS, Gentoo, Arch Linux, and many others.
Reemplazo de cadena en un rango de líneas
También puede especificar un rango de números de línea para el sed
comando que reemplaza una cadena. El siguiente comando reemplaza solo las primeras apariciones de “Linux” por “Unix” entre las líneas 1 y 3.
sed '1,3 s/Linux/Unix/' file1.txt
Producción:
OutputUnix is a family of free and open-source operating systems based on the Linux kernel.
This is inserted text.
Operating systems based on Unix are known as Linux distributions or distros.
This is appended text.
Example includes Debian, Ubuntu, Fedora, CentOS, Gentoo, Arch Linux, and many others.
Consideraciones de rendimiento para archivos grandes
Procesar archivos grandes sed
puede consumir muchos recursos, especialmente al trabajar con numerosas operaciones o conjuntos de datos muy grandes. Aquí tienes algunos consejos para optimizar el rendimiento y garantizar un uso eficiente del sed
comando:
1. Usar -n
para minimizar la salida innecesaria : Esta -n
opción suprime la impresión automática de cada línea y garantiza que solo se muestre la salida deseada. Esto reduce la sobrecarga al trabajar con archivos grandes.
Ejemplo:
sed -n '/pattern/p' largefile.txt
2. Simplifique los scripts : minimice el número de operaciones en un solo comando. Por ejemplo, en lugar de ejecutar varios sed
comandos secuencialmente, combínelos en un solo script para reducir la lectura de archivos.
Ejemplo:
sed -e 's/foo/bar/' -e '/pattern/d' largefile.txt
3. Entrada de flujo con tuberías : al procesar datos de otros comandos o flujos, utilice tuberías para evitar la creación de archivos intermedios y reducir la E/S de disco.
Ejemplo:
cat largefile.txt | sed 's/foo/bar/' > output.txt
4. Evite la edición in situ en archivos grandes : en lugar de modificar directamente archivos grandes, escriba la salida en un nuevo archivo y reemplace el original después de verificar la corrección.
Ejemplo:
sed 's/old/new/' largefile.txt > temp.txt && mv temp.txt largefile.txt
5. Alternativas de referencia : para archivos muy grandes, considere usar herramientas como awk
, perl
, o grep
, que pueden ofrecer un mejor rendimiento para ciertas tareas.
Ejemplo:
awk '{gsub(/old/, "new"); print}' largefile.txt > output.txt
Puede consultar estos tutoriales sobre el comando AWK en Linux y Cómo usar el lenguaje AWK para manipular texto en Linux para obtener más información sobre el uso de awk
comandos en Linux.
Integración con scripts de Shell
El sed
comando se usa comúnmente en scripts de shell para automatizar tareas repetitivas de manipulación de texto. A continuación, un ejemplo:
#!/bin/bash
# Replace all occurrences of "foo" with "bar" in input.txt and save the result
sed 's/foo/bar/g' input.txt > output.txt
Este script procesa input.txt
y escribe la salida modificada en output.txt
.
sed
vs otras alternativas
Si bien sed
es una herramienta eficaz y ligera para el procesamiento básico de texto, alternativas modernas como awk
y perl
ofrecen funciones adicionales, lo que las hace más adecuadas para tareas específicas. A continuación, se detallan las diferencias clave y cuándo usar cada una:
Cuándo utilizarlosed
- Sustituciones o eliminaciones de texto rápidas y sencillas.
- Transformaciones basadas en líneas en archivos.
- Tareas que requieren una sobrecarga de scripting mínima.
Cuándo utilizarloawk
- Manejo de datos estructurados como archivos CSV o TSV.
- Realizar cálculos aritméticos junto con el procesamiento de texto.
- Generar informes formateados a partir de datos de entrada.
Ejemplo:
awk -F, '{print $1, $3}' data.csv
Esto extrae e imprime el primer y tercer campo de un archivo CSV.
Cuándo utilizarloperl
- Manipulaciones de texto complejas que involucran expresiones regulares avanzadas.
- Combinando el procesamiento de texto con lógica o condiciones.
- Cómo escribir scripts compactos pero potentes.
Ejemplo:
perl -pe 's/(error)/WARNING: $1/' logfile.txt
Esto agrega un prefijo “ADVERTENCIA:” a las líneas que contienen la palabra “error”.
Conclusión
Dominar el sed
comando mejora tu capacidad para manipular y procesar texto eficientemente en Linux. Sus potentes funciones y su integración fluida con scripts lo convierten en una herramienta valiosa para tareas de manipulación de texto.
Próximos pasos
Tras dominar los conceptos básicos de sed
, podrá aprender técnicas y casos de uso más avanzados. Puede utilizar la siguiente serie de tutoriales sobre sed
temas relacionados que le ayudarán a profundizar su comprensión y mejorar sus habilidades de procesamiento de texto:
- Conceptos básicos del uso del
sed
editor de secuencias para manipular texto en Linux - Intermedio
sed
: Manipulación de flujos de texto en un entorno Linux
Estos tutoriales abarcan diversos temas, desde sed
operaciones básicas hasta técnicas más complejas de manipulación de texto. Son un recurso valioso para quienes desean dominar el procesamiento de texto en la línea de comandos.
Preguntas frecuentes
¿Qué es sed
un comando en Linux?
El sed
comando “Editor de Flujo” en Linux es una potente herramienta de procesamiento de texto que permite realizar transformaciones básicas de texto en un flujo de entrada (un archivo o la entrada de una canalización). Permite buscar, reemplazar, eliminar e insertar texto, lo que lo hace muy útil para automatizar tareas de manipulación de texto.
¿Cuando utilizarlo sed
?
Puede utilizarlo sed
en los siguientes escenarios:
- Reemplazo de texto : reemplace palabras, frases o patrones en archivos o transmisiones.
- Eliminación de texto : elimina líneas o patrones específicos.
- Edición en el lugar : modifique archivos directamente sin necesidad de abrir un editor de texto.
- Procesamiento por lotes : realice la misma operación en varios archivos mediante scripts.
- Inserción/extracción de texto : inserte o extraiga texto específico en archivos estructurados, como archivos de configuración o registros.
¿Cómo utilizarlo sed
correctamente?
Para utilizarlo sed
eficazmente, siga estos pasos:
sed [options] 'command' file
command
:Lased
operación (por ejemplo,s
para sustituir,d
para eliminar).file
:El archivo de destino a procesar.
Prueba antes de aplicar en el lugar: primero, ejecute el comando sin la -i
opción ‘ para ver el resultado antes de modificar los archivos directamente.
Utilice expresiones regulares: aproveche el soporte de sed para expresiones regulares para hacer coincidir y manipular patrones complejos.
Encadenar varios comandos: utilice ;
o -e
para ejecutar varios sed
comandos en una sola operación.
¿Cómo usar sed para reemplazar texto?
Para reemplazar texto, utilice el s
comando substituir con esta sintaxis:
sed 's/old_text/new_text/' file
Ejemplos:
- Reemplace la primera aparición de “foo” con “bar” en cada línea:
sed 's/foo/bar/' file.txt
- Reemplace todas las ocurrencias de “foo” con “bar” globalmente:
sed 's/foo/bar/g' file.txt
- Reemplazo en el lugar (modifica el archivo directamente):
sed -i 's/foo/bar/g' file.txt
¿Cómo ejecuto un sed
comando?
Puede ejecutar un sed
comando directamente desde la terminal utilizando esta sintaxis básica:
sed 'command' filename
Ejemplo:
Para imprimir líneas que contengan la palabra “error” y reemplazar “error” por “advertencia” en un archivo llamado log.txt
:
sed 's/error/warning/' log.txt
¿Cuál es la diferencia entre los comandos grep
y sed
en Linux?
Característica | grep | sed |
---|---|---|
Objetivo | Buscar patrones en uno o más archivos | Editar secuencias de texto |
Producción | Imprime líneas que contienen el patrón. | Imprime el texto editado |
Comportamiento | Buscar, filtrar | Buscar, Reemplazar, Insertar, Eliminar |
Uso | grep pattern file | sed 'command' file |
Buscar y reemplazar | Sí (limitado) | Sí |
Edición en el lugar | No | Sí |
Expresiones regulares | Sí | Sí |
Operaciones multilínea | No | Sí |
Filtrado de texto | No | Sí |
Casos de uso comunes | Búsqueda de registros, búsqueda de patrones en el texto | Edición de archivos de configuración, reemplazo de texto en varios archivos |
Ejemplo:
- Usando
grep
para buscar “error” enlog.txt
:
grep 'error' log.txt
- Usando
sed
para reemplazar “error” con “advertencia” enlog.txt
:
sed 's/error/warning/g' log.txt
¿Cómo eliminar una línea vacía usando sed
?
Para eliminar líneas vacías de un archivo, utilice el siguiente sed
comando:
sed '/^$/d' file.txt
Explicación:
^$
: Coincide con líneas vacías (líneas sin caracteres).d
:Elimina las líneas coincidentes.
Ejemplo:
Antes de ejecutar el comando, un archivo podría verse así:
line 1
line 2
line 3
Después de ejecutar el comando:
sed '/^$/d' file.txt
La salida será:
Outputline 1
line 2
line 3