Inicio APP y Software Comando sed en Linux: ¿Cómo usar el editor de flujo?

Comando sed en Linux: ¿Cómo usar el editor de flujo?

676
0

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 comando l (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.

Te recomendamos  Cómo congelar columnas en Excel en Mac

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.

comando sed en linux 1
comando sed en linux 1

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.

comando sed en linux 2
comando sed en linux 2

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
comando sed en linux 3
comando sed en linux 3

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
comando sed en linux 4
comando sed en linux 4

El comando omitió tres instancias de la palabra porque eran las primeras en la línea y solo reemplazó la última.

Te recomendamos  Gifdeck - Convertir presentación de slideshare a Gif animado

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.

comando sed en linux 5
comando sed en linux 5

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:

comando sed en linux 6
comando sed en linux 6
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.

comando sed en linux 7
comando sed en linux 7

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.

Te recomendamos  ¿Cómo desactivar el bloqueo de desplazamiento en Excel?
comando sed en linux 8
comando sed en linux 8

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
comando sed en linux 9
comando sed en linux 9

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
comando sed en linux 10
comando sed en linux 10

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.

comando sed en linux 11
comando sed en linux 11

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
comando sed en linux 12
comando sed en linux 12

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.