Introducción
SED es un editor de flujo de texto utilizado en sistemas Unix para editar archivos de manera rápida y eficiente. La herramienta busca, reemplaza, agrega y elimina líneas en un archivo de texto sin abrirlo en un editor de texto.
Aprende cómo utilizar el comando sed y sus opciones a través de ejemplos fáciles de seguir.
Sintaxis de sed en Linux
La sintaxis principal para utilizar el comando sed en Linux es:
sed OPCIONES... [SCRIPT] [ARCHIVO DE ENTRADA...]
Opciones de sed en Linux
Puedes ejecutar sed con las siguientes opciones de línea de comandos:
-b, --binary
– Abrir archivos de entrada en modo binario para considerar que las líneas terminan en un salto de línea.--debug
– Cambiar al modo de depuración para imprimir la entrada en forma canónica y anotar la ejecución del programa.--follow-symlinks
– Editar el destino final si el archivo especificado es un enlace simbólico. Solo funciona en combinación con la opción-i
.--help
– Mostrar la información de uso.--i, --in-place [=SUFFIX]
– Realizar ediciones en el lugar, sobrescribiendo el archivo original.--posix
– Desactivar todas las extensiones de sed POSIX para simplificar la escritura de scripts portátiles.--version
– Mostrar la versión de sed que se está ejecutando en el sistema.-E, -r, --regexp-extended
– Utilizar expresiones regulares extendidas.-e script, --expression=script
– Agregar un script especificado para ejecutar con los comandos.-f script-file
– Agregar el contenido de un archivo de script especificado para ejecutar con los comandos.-l N, --line-length=N
– Definir la longitud de ajuste de línea deseada para el comandol
(valor predeterminado es 70).-n, --quiet, --silent
– Desactivar la impresión de salida.-s, --separate
– Ver archivos especificados como archivos separados, no como un flujo largo y continuo.--sandbox
– Desactivar la ejecución de programas externos y operar solo en archivos de entrada en la línea de comandos.-u, --unbuffered
– Minimizar el búfer de entrada y salida.-z, --null-data, --zero-terminated
– Ver la entrada como un conjunto de líneas donde cada una termina con un byte cero.
Ejemplos de sed en Linux
A continuación, mostramos diez comandos, ejemplos y sintaxis de sed comúnmente utilizados.
Para este tutorial, creamos un archivo de muestra con el nombre foxinbox.txt
con el siguiente contenido:
Knox in box.
Fox in socks.
Knox on fox in socks in box.
Socks on Knox and Knox in box.
Fox in socks on box on Knox.
Ten en cuenta que sed no afecta al archivo fuente a menos que se indique. En su lugar, el comando muestra los cambios realizados por el comando dado en su salida.
Para sobrescribir el archivo original, utiliza la opción -i
para guardar las modificaciones. Sin embargo, no se recomienda esta práctica antes de probar la salida del comando.
Alternativamente, guarda las ediciones en un archivo diferente (o nuevo). Redirige la salida agregando > nuevonombrearchivo.txt
al final del comando.
Reemplazar cadena usando el comando sed
El comando sed en Linux se utiliza comúnmente para sustituir texto. Busca el patrón especificado en un archivo y lo reemplaza por la cadena deseada.
Para reemplazar texto usando sed, utiliza el comando de sustitución s
y delimitadores (en la mayoría de los casos, barras diagonales – /
) para separar los campos de texto.
Por lo tanto, la sintaxis para reemplazar texto es:
sed 's/antigua_cadena/nueva_cadena/' archivo.txt
Reemplaza antigua_cadena
con el texto que deseas sustituir y nueva_cadena
con el texto por el que deseas cambiarlo.
Por ejemplo, para reemplazar las instancias de box
por la palabra bin
, ejecuta:
sed 's/box/bin/' foxinbox.txt
La salida muestra el texto con las palabras reemplazadas, como se muestra en la imagen a continuación.
Reemplazar todas las ocurrencias de una cadena usando el comando sed
De forma predeterminada, sed solo reemplaza la primera ocurrencia de la cadena especificada en cada línea. Busca la primera instancia de la palabra especificada en una línea, la reemplaza y pasa a la siguiente línea.
Con múltiples instancias de la palabra box
en la misma línea, el comando solo sustituye la primera.
Si tienes múltiples instancias de la misma palabra dentro de una sola línea, agrega la bandera g
al comando para cambiar todas ellas.
El comando para sustituir cada ocurrencia de una cadena dada dentro de un texto es:
sed 's/antigua_cadena/nueva_cadena/g' archivo.txt
Para reemplazar la palabra box
por la palabra bin
en el archivo foxinbox.txt
en cada instancia, escribe:
sed 's/box/bin/g' foxinbox.txt
La salida anterior muestra que el comando reemplazó todas las instancias de la palabra box
.
Reemplazar una ocurrencia específica en una línea usando el comando sed
El comando sed te permite elegir qué ocurrencia de una cadena especificada deseas reemplazar dentro de cada línea. Para hacerlo, agrega una bandera numérica como 1, 2, etc.:
sed 's/antigua_cadena/nueva_cadena/#' archivo.txt
Por ejemplo, para sustituir la segunda ocurrencia de la palabra box
en cada línea del texto por la palabra bin
, utiliza este comando:
sed 's/box/bin/2' foxinbox.txt
El comando omitió tres instancias de la palabra porque eran las primeras en la línea y solo reemplazó la última.
Solo imprimir líneas con texto sustituido
De forma predeterminada, el comando sed imprime todo el contenido del archivo, junto con el texto sustituido en su salida. Si tienes mucho texto y deseas enfocarte en las líneas con los cambios aplicados, agrega los atributos necesarios al comando.
Para imprimir solo las líneas que tienen sustitución bajo las condiciones dadas, utiliza la sintaxis:
sed -n 's/antigua_cadena/nueva_cadena/p' archivo.txt
La opción -n
deshabilita la impresión automática, mientras que el comando de sustitución p
indica a sed que imprima las líneas donde ocurre la sustitución.
Puedes agregar el comando p
a otros comandos de sustitución, como se muestra en el siguiente ejemplo:
sed -n 's/box/bin/2p' foxinbox.txt
El comando reemplaza la segunda instancia de la palabra box
en una línea e imprime la línea donde se realizó el cambio. En la imagen a continuación, solo se muestra una línea con la sustitución aplicada.
Reemplazar cadena usando el comando sed y omitir mayúsculas y minúsculas
De forma predeterminada, el comando sed distingue entre mayúsculas y minúsculas. Por ejemplo, el siguiente contenido contiene la palabra fox
con letras iniciales en mayúsculas y minúsculas:
Knox in box.
Fox in socks.
Knox on fox in socks in box.
Socks on Knox and Knox in box.
Fox in socks on box on Knox.
Para sustituir todas las instancias de la palabra fox
, no ejecutes el comando habitual:
sed 's/fox/cow/' foxinbox.txt
El resultado del comando solo cambia la ocurrencia de la palabra fox
donde está completamente en minúsculas:
Knox in box.
Cow in socks.
Knox on cow in socks in box.
Socks on Knox and Knox in box.
Cow in socks on box on Knox.
Para ignorar las mayúsculas y minúsculas al sustituir texto, agrega el subcomando i
al final del comando:
sed 's/antigua_cadena/nueva_cadena/i' archivo.txt
Por lo tanto, el comando para cambiar las instancias en mayúsculas y minúsculas de la palabra fox
en el texto anterior es:
sed 's/fox/cow/i' foxinbox.txt
La salida muestra que el comando cambió las tres instancias de la cadena especificada.
Reemplazar cadena en una línea específica usando el comando sed
El comando sed te permite sustituir una cadena en una línea específica agregando el número de línea como prefijo al subcomando s
:
sed '# s/antigua_cadena/nueva_cadena/' archivo.txt
Para probar esta función en el archivo de ejemplo foxinbox.txt
, reemplaza la palabra socks
por sandals
solo en la cuarta línea (línea 4) del texto utilizando el comando:
sed '4 s/socks/sandals/' foxinbox.txt
La salida muestra que la primera instancia de la palabra socks
en la segunda línea permanece igual, mientras que la misma palabra ha sido reemplazada por sandals
en la cuarta línea.
Reemplazar cadena solo en un rango específico de líneas usando el comando sed
Para reemplazar múltiples instancias de una cadena dentro de un rango de líneas, pero no en todo el texto, especifica el rango en el que deseas que sed realice la sustitución. La sintaxis es:
sed '#,# s/antigua_cadena/nueva_cadena/' archivo.txt
Reemplaza el primer # con el número de línea inicial y el segundo # con el número de línea final que deseas incluir.
Por ejemplo, para reemplazar las últimas dos instancias de la palabra socks
en el archivo foxinbox.txt
(que se encuentran en la cuarta y sexta línea) por la palabra sandals
, ejecutarías:
sed '4,6 s/socks/sandals/' foxinbox.txt
Eliminar una línea específica usando el comando sed
Para eliminar una línea de un archivo con el comando sed, utiliza el subcomando d
y la sintaxis:
sed '#d' archivo.txt
Especifica el número de línea que deseas eliminar en lugar del símbolo # y ejecuta el comando.
Por ejemplo, para eliminar la segunda línea del archivo foxinbox.txt
, escribe:
sed '2d' foxinbox.txt
Eliminar líneas dentro de un rango específico de líneas usando el comando sed
Para eliminar varias líneas dentro de un rango de líneas utilizando el comando sed, sigue la siguiente sintaxis:
sed '#,#d' archivo.txt
Reemplaza los símbolos de almohadilla (#) con el inicio y el final del rango de líneas. Por ejemplo:
sed '2,4d' foxinbox.txt
El comando anterior elimina las líneas 2, 3 y 4 del archivo.
Eliminar desde una línea específica hasta la última línea usando el comando sed
Para eliminar líneas desde un número de línea específico hasta la última línea, utiliza el siguiente comando:
sed '#,$d' archivo.txt
Es decir, para eliminar todo, desde la línea 3 hasta el final de foxinbox.txt
, ejecuta este comando:
sed '3,$d' foxinbox.txt
Conclusión
En este artículo, aprendiste cómo utilizar el editor de flujo de texto SED para modificar un archivo a través de la línea de comandos. Una vez que hayas realizado los cambios en el texto y guardado la última versión, decide si deseas conservar el archivo original o no.
Si estás trabajando con datos sensibles, es posible que desees eliminar permanentemente el archivo utilizando el comando shred
.
Para obtener una lista de todos los comandos importantes de Linux en un solo lugar, consulta la Hoja de trucos de comandos de Linux.