El comando sed es una abreviatura de stream editor (editor de flujo). Es una herramienta muy popular en sistemas Linux/UNIX. Sed no es un editor de texto por sí mismo. Sin embargo, puede realizar varias modificaciones para manipular un texto dado. La entrada de texto se envía como un flujo. Sed luego realiza las acciones indicadas en el flujo. Esta guía ofrece una visión general del sed comando y cómo operarlo para manipular texto con éxito en Linux.
Sed en Linux
El flujo de entrada de sed puede provenir de un archivo de texto o de STDIN (entrada estándar). Podemos trabajar con la salida de otro comando o trabajar directamente con un archivo de texto. La sed herramienta viene preinstalada en todas las Linux distribuciones.
Descripción general del uso de Sed
El sed comando sigue la siguiente estructura:
|
1 |
$ sed <opciones> <comandos> <archivo> |
Para fines de demostración, hemos tomado la versión de texto de licencia GPL versión 3:
|
1 |
$ wget https://www.gnu.org/licenses/gpl-3.0.txt |
El siguiente sed comando imprimirá el contenido del archivo de texto:
|
1 |
$ sed '' gpl-3.0.txt |
Aquí, sed está realizando las operaciones descritas dentro de las comillas simples e imprimiendo la salida. Como no hay ninguna opción definida, sed simplemente realizará una operación en blanco e imprimirá todo el contenido del archivo.
Sed también acepta la salida de un comando diferente como flujo de entrada. En el siguiente ejemplo, canalice el contenido del archivo de texto GPL v3 a sed para realizar una operación en blanco:
|
1 |
$ cat gpl-3.0.txt | sed '' |
Cómo imprimir líneas
Sin ninguna opción especificada, sed imprimirá todo el contenido del archivo directamente. En su lugar, podemos enviar explícitamente el comando de impresión para imprimir los resultados directamente en la salida estándar (STDOUT).
Para imprimir la salida, use el carácter p:
|
1 |
$ sed 'p' gpl-3.0.txt |
Por defecto, sed imprime la salida en la pantalla. Debido a que usamos específicamente el comando de impresión, sed imprimirá cada línea dos veces. Sed funciona línea por línea. Lee una línea, realiza operaciones específicas, la imprime y pasa a la siguiente línea.
Como podemos ver, cada línea se imprime dos veces. Si el resultado es confuso de esta manera, podemos limpiarlo usando la -n opción. Suprime la función de impresión automática. Como estamos enviando el comando de impresión, no necesitamos habilitar la función de impresión de salida predeterminada:
|
1 |
$ sed -n 'p' gpl-3.0.txt |
Clases de caracteres de expresiones regulares
En las expresiones regulares, existen varias clases de caracteres. Cada una de estas clases tiene un rango. Muchas clases también tienen múltiples expresiones. La mayoría de las clases son rangos de caracteres:
-
- [a-z]: Carácter en minúscula
-
- [A-Z]: Carácter en mayúscula
-
- [0-9]: Dígitos
-
- [a-zA-z]: Alfabeto
-
- [a-zA-z0-9]: Cualquier carácter alfanumérico
Estas clases de caracteres también tienen diferentes notaciones:
-
- [:lower:]: Carácter en minúscula
-
- [:upper:]: Carácter en mayúscula
-
- [:digit:]: Dígitos
-
- [:alpha:]: Alfabeto
-
- [:alphanum:]: Carácter alfanumérico
Por ejemplo, el siguiente comando imprimirá todas las líneas que contengan al menos un dígito:
|
1 |
$ sed -n 's/[[:digit:]]/&/p' gpl-3.0.txt |
Rangos de direcciones
Podemos especificar la parte específica del flujo de texto con la que trabajar. Puede ser la ubicación estática de una línea o un rango de líneas. En el primer ejemplo, imprimiremos la línea 5 del archivo de texto GPL v3:
|
1 |
$ sed -n '5p' gpl-3.0.txt |
En lugar de una sola línea, también podemos especificar un rango de líneas con las que trabajar. Aquí, hemos indicado el rango de direcciones desde la línea 5 a la línea 9 (un total de 5 líneas) en el que sed trabajará:
|
1 |
$ sed -n '5,9p' gpl-3.0.txt |
También existen diferentes formas de especificar la dirección de la línea. En lugar de determinar los números de línea nosotros mismos, podemos reorganizar el ejemplo anterior para que sed comience desde la línea 5 y opere en las siguientes 5 líneas:
|
1 |
$ sed -n '5,+5p' gpl-3.0.txt |
Otra forma de especificar líneas es mediante el uso de intervalos. En el siguiente ejemplo, sed comenzará desde la línea 1 y operará en líneas alternas:
|
1 |
$ sed -n '1~2p' gpl-3.0.txt |
Eliminación de texto
Hasta ahora, hemos trabajado en la impresión de líneas de texto de destino. En lugar de imprimir, podemos eliminar las líneas de la salida. En el siguiente ejemplo, eliminaremos varias líneas desde el principio. Aquí, no necesitamos usar la opción -n porque queremos que sed imprima todo lo demás que no se haya eliminado. Para la eliminación de líneas, utilizaremos la opción d:
|
1 |
$ sed '1~2d' gpl-3.0.txt |
Ten en cuenta que el archivo de origen sigue intacto. Sed solo está realizando la eliminación de líneas durante la salida. Si lo deseas, puedes guardar la salida de sed en un archivo. Puedes sobrescribir el archivo original o guardarlo como uno diferente:
|
1 |
$ sed '1~2d' gpl-3.0.txt > gpl-3.0.modified.txt |
En lugar de escribir manualmente la salida en un archivo, sed puede realizar una edición in situ en el archivo original. En resumen, sed editará el archivo original y escribirá los cambios realizados. Este método sobrescribirá el archivo original, por lo que debe usarse con cuidado:
|
1 |
$ sed -i '1~2d' gpl-3.0.txt |
Debido a que la edición in situ es peligrosa, sed viene con la función de copia de seguridad. Al realizar ediciones in situ, utiliza -i.bak en lugar de -i para hacer una copia de seguridad antes de editar. Sed creará el archivo de copia de seguridad con la extensión .bak :
|
1 |
$ sed -i.bak '1~2d' gpl-3.0.txt |
Sustitución de texto
Esta es, con diferencia, una de las implementaciones más comunes de sed. Busca un patrón de texto y lo reemplaza con un texto dado. Aquí, el patrón de texto se describe en expresiones regulares (regex para abreviar). Para obtener más información sobre el uso de regex, sigue este tutorial que describe cómo usar Grep con regex para buscar patrones de texto en archivos.
Aquí tienes un ejemplo de la sustitución de texto más básica usando regex:
|
1 |
$ 's/<search_pattern>/<replacement>' |
Aquí, s es el comando para la sustitución. Las barras diagonales son delimitadores para el patrón y el reemplazo. Pongámoslo en acción:
|
1 |
$ echo "hello world" | sed 's/hello/HELLO/' |
El siguiente ejemplo demostrará el uso del guion bajo (_). Aquí, los guiones bajos actuarán como delimitadores:
|
1 |
$ echo http://example.com/index.html | sed 's_com/index_net/home_' |
Aquí, estamos buscando com/index para cambiarlo por net/home. Ten en cuenta la ubicación de los guiones bajos, ya que es muy crucial. Por ejemplo, si te falta el último guion bajo, sed arrojará un error:
|
1 |
$ echo "http://www.example.com/index.html" | sed 's_com/index_net/home' |
Necesitamos un archivo de prueba para practicar alguna sustitución. Aquí tengo una versión recortada del archivo de texto GPL v3:
|
1 |
$ cat gpl-3.0.cropped.txt |
Realicemos algunas sustituciones de texto básicas:
|
1 |
$ cat gpl-3.0.cropped.txt | sed 's/GNU/GNU is Not Unix/' |
Echa un vistazo al siguiente ejemplo. Queremos cambiar todas las instancias de the a THE :
|
1 |
$ echo "the the quick brown fox jumps over the lazy dog" | sed 's/the/THE/' |
¿Notas algo? Sed no cambió todas las instancias de the. De hecho, solo cambió la primera instancia. ¿Qué está pasando? Este es el comportamiento predeterminado de la opción s. Solo coincide con la primera instancia de una línea dada y pasa a la siguiente. Para asegurarse de que sed busque el patrón de búsqueda en toda la línea, necesitamos usar una bandera opcional g. Corrijamos el comando:
|
1 |
$ echo "the the quick brown fox jumps over the lazy dog" | sed 's/the/THE/g' |
Ahora funciona como se esperaba. Otra forma interesante de usar el comando es especificando el número de instancias a cambiar. En el ejemplo anterior, había 3 instancias de the, ¿verdad? ¿Qué tal si especificamos cambiar solo la 3ra instancia? El cambio ocurrirá en la bandera opcional:
|
1 |
$ echo "el el rápido zorro marrón salta sobre el perro perezoso" | sed 's/the/THE/3' |
Si estás trabajando con un archivo de texto grande, entonces puede ayudar que sed imprima solo aquellas líneas donde se realizaron las sustituciones. Para lograr eso, necesitamos agregar otra bandera adicional p:
|
1 |
$ sed -n 's/GNU/GNU is Not Unix/gp' gpl-3.0.txt |
Sensibilidad a mayúsculas y minúsculas
Por defecto, todas las sed operaciones distinguen entre mayúsculas y minúsculas. El siguiente comando demostrará el comportamiento por defecto de la sensibilidad a mayúsculas y minúsculas:
|
1 |
$ echo "HELLO WORLD" | sed 's/hello/hElLo/' |
Debido a la discrepancia de mayúsculas y minúsculas, no hay cambios. En tal situación, podemos decirle a sed que desactive la sensibilidad a mayúsculas y minúsculas. Para hacerlo, añade la bandera opcional i:
|
1 |
$ echo "HELLO WORLD" | sed 's/hello/hElLo/i' |
Cómo reemplazar y referenciar textos
El poder de sed reside principalmente en su capacidad para usar expresiones regulares. Con patrones de expresiones regulares más avanzados y complejos, podemos lograr mucho más. Por ejemplo, podemos sustituir texto desde el principio de un archivo hasta una ubicación determinada. Echa un vistazo a la siguiente expresión:
|
1 |
$ sed 's/^.*GNU/GNU_replaced/' gpl-3.0.txt |
Aquí, el símbolo de intercalación (^) denota el inicio de la línea. El operador para coincidir con cualquier carácter se representa mediante el punto (.). El asterisco (*) es la expresión comodín, que coincide desde el principio de la línea hasta GNU.
Otro truco interesante es usar el símbolo &. Podemos usarlo para resaltar las áreas que sed encuentra con el patrón de búsqueda:
|
1 |
$ sed 's/^.*GNU/(&)/' gpl-3.0.txt |
Reflexiones finales
En este tutorial, exploramos los conceptos básicos del comando sed . Aprendimos a imprimir líneas específicas, buscar textos, eliminar y reemplazar textos, sobrescribir textos y usar expresiones regulares. Un comando sed construido correctamente puede transformar drásticamente un documento de texto. Ahora puedes manipular texto con éxito en Linux con la ayuda de sed.
¡Feliz computación!









Comentarios
Aún no hay comentarios. Sea el primero.