Cómo utilizar Sed en Linux
Sed es un programa UNIX simple que no crea ni edita archivos. Solo modifica los datos que pasan por su entrada y presenta los datos modificados en su salida. Aquí, observamos una breve descripción general de la filosofía UNIX, repasamos los conceptos básicos de uso sed
y le mostramos ejemplos de cómo usar el programa para tareas diarias.
Los conceptos básicos del uso de Sed
Sed es un programa que puede leer y modificar flujos de datos de texto. Esto significa que, a diferencia de un editor de texto normal, sed no modifica directamente los archivos de su computadora. En cambio, actúa más como un «filtro» para los datos entrantes y le permite transformarlos de la forma que desee.
Para comenzar a usar sed, primero crea un archivo con al menos cinco líneas de texto dentro. Asegúrate de que haya un carácter de «nueva línea» entre las líneas:
El comando general para sed es algo como:
Una de las funciones más básicas de sed es el n
subcomando. Funciona leyendo datos de la entrada de sed y colocándolos en el “espacio de patrones” de su programa. Este es un búfer especial que almacena cualquier texto entrante antes de que sed lo manipule:
Otra de las funciones básicas de sed es el p
subcomando. De manera similar a n
, lee los datos que llegan desde la entrada de sed y los coloca en el espacio de patrones del programa. Sin embargo, también los imprime explícitamente en la salida de su terminal.
El uso del p
subcomando puede resultar confuso para los principiantes, ya que ejecutarlo con cualquier entrada de texto hace que sed imprima su salida dos veces. Esto se debe a que, de forma predeterminada, sed imprime automáticamente su espacio de patrones independientemente de si p
está presente o no:
Para desactivar este comportamiento peculiar, agregue la -n
bandera antes de ejecutar los subcomandos sed:
Una vez aclarados los conceptos básicos, las siguientes secciones analizarán las diferentes formas en que puede utilizar sed para manipular datos de texto.
1. Seleccionar y recortar secuencias de texto
Además de imprimir, también puede utilizar sed para seleccionar y recortar texto tanto de secuencias de datos como de archivos. La forma más sencilla de hacerlo es agregar un valor de rango al p
subcomando.
El siguiente comando utiliza la sintaxis de rango de sed para imprimir la tercera a la quinta línea en su archivo “hello.txt”:
También puede utilizar el p
subcomando para imprimir líneas no adyacentes en su texto. Por ejemplo, lo siguiente imprime la primera y la cuarta línea en el archivo “hello.txt”:
2. Eliminar texto de una secuencia de Sed
Sed también puede eliminar datos de cualquier flujo de texto entrante. Esto resulta útil si desea eliminar algunas líneas de texto de un archivo grande o limpiar la salida de un programa para mostrar solo la información que necesita.
Para ello, utilice el d
subcomando junto con la línea o rango específico que desea eliminar:
De manera similar a la impresión de líneas de texto, el d
subcomando funciona con rangos de varias líneas. Por ejemplo, el siguiente comando eliminará las primeras cuatro líneas del archivo “hello.txt”:
Además de hacer coincidir rangos de líneas específicos, puedes usar expresiones regulares para buscar el texto que deseas eliminar. Al hacer esto, se le indicará a sed que busque todas las líneas que contengan la palabra «mundo» y las elimine:
También puede tratar las expresiones regulares como un rango para su archivo de entrada. Esto le brinda más flexibilidad para definir sus selecciones dentro del programa:
3. Cómo agregar texto nuevo a un flujo de datos SED
Además de eliminar texto, sed también puede agregar texto nuevo a flujos de datos existentes. Si bien no está al nivel de un editor de texto completo, esta función puede resultar útil para ediciones puntuales y adiciones de texto básicas.
Para agregar una nueva línea de texto, ejecute sed con el a
comando seguido del texto que desea agregar:
También es posible incluir archivos completos en un flujo de texto sed. Para ello, utilice el r
comando seguido del nombre del archivo que desea agregar:
4. Búsqueda y reemplazo de texto en Sed
Una de las características más potentes de sed es su capacidad de buscar y reemplazar texto de un flujo de texto. A diferencia de agregar y eliminar texto, esto le permite editar datos de forma dinámica a medida que pasan por las tuberías de UNIX, lo que lo hace mucho más flexible en comparación con un editor de texto normal.
Comience por imprimir una prueba de su entrada de texto sin ninguna modificación de sed:
Reemplace el p
subcomando con s
, luego agregue tres barras invertidas (/) después de él:
Inserte una expresión regular estructural de la cadena de caracteres que desea que coincida entre la primera y la segunda barra invertida. Por ejemplo, puedo poner el siguiente valor para buscar palabras que comiencen con «wo» en mi cadena de entrada:
Coloque el cursor de texto entre la segunda y la tercera barra invertida y, a continuación, proporcione el texto con el que desea reemplazar las coincidencias. A diferencia de la columna anterior, esta sección no utiliza expresiones regulares estructurales:
De manera predeterminada, sed solo reemplaza la primera cadena que coincide en una línea en particular. Esto puede ser un problema si desea reemplazar cada instancia de una palabra en su secuencia de texto. Para solucionar esto, agregue la g
opción después de la tercera barra invertida de su expresión:
5. Copiar datos de texto al espacio de almacenamiento
Sed utiliza dos buffers para almacenar datos de texto: el espacio de patrones y el espacio de retención. El primero sirve como un lugar temporal para el texto a medida que pasa por las expresiones sed. Mientras tanto, el segundo actúa como un portapapeles donde se pueden almacenar datos de texto arbitrarios.
Una ventaja de este enfoque es que permite «conservar» determinados resultados sin depender de programas externos. Esto puede resultar útil si planea utilizar sed para procesar manipulaciones de texto de varios pasos.
Para comenzar a utilizar espacios de retención, primero asegúrese de tener un archivo con al menos algunas líneas de texto dentro:
Reemplace el p
subcomando con h
, luego proporcione un número de línea o un valor de expresión regular que sed coincidirá en su archivo. Al hacer esto, se le indicará a sed que tome esa línea de texto específica y la copie en su espacio de almacenamiento:
También puede utilizar el H
subcomando para almacenar varias líneas de texto dentro de su espacio de espera. Por ejemplo, el siguiente comando almacena la tercera y cuarta línea de mi archivo de texto y las imprime en la terminal:
6. Uso de etiquetas para crear bucles en Sed
Si bien sed no es un lenguaje de programación completo, es posible crear bucles dentro del programa. Esto resulta útil si necesita una expresión sed que tenga que recorrer continuamente un fragmento de texto en particular.
Para crear un bucle en sed, primero debe crear una etiqueta para su expresión sed. Para ello, debe utilizar el :
subcomando seguido de la etiqueta que desea utilizar para su expresión.
Proporcione los criterios de coincidencia para su expresión sed. En mi caso, quiero que aparezca al final de cada línea en mi texto de entrada:
Escriba los subcomandos de sed que desea ejecutar cada vez que sed encuentre una coincidencia y luego enciérrelos entre llaves. Lo siguiente une dos líneas adyacentes, reemplaza el carácter de nueva línea con un espacio y luego vuelve al comienzo de la expresión:
Incluso puedes ampliarlo para que coincida con casi cualquier tipo de texto de entrada. Por ejemplo, el siguiente comando utiliza la función de expresiones regulares extendidas de sed para eliminar las etiquetas HTML del texto de entrada:
7. Realizar cambios permanentes en Sed
Al igual que cualquier otra herramienta UNIX, sed puede aprovechar la redirección de salida y las tuberías. Esto no solo le permite unir sed con otros programas, sino que también le brinda la oportunidad de hacer que sus cambios sean permanentes.
La siguiente línea de código crea un nuevo archivo “welcome.txt” a partir de la salida de mi comando sed:
Además de la redirección de salida, también puede utilizar la bandera incorporada -i
para editar su archivo actual en lugar de mostrar los cambios en la consola de su terminal. Por ejemplo, el siguiente comando elimina todos los caracteres de nueva línea de mi archivo de texto y lo guarda:
Si toda esta charla le ha hecho sentir curiosidad por la línea de comandos de Linux, puede leer nuestro artículo anterior en el que hablamos de algunos de los indicadores de Bash más interesantes que puede utilizar hoy en día.
Crédito de la imagen: Morgan Richardson vía Unsplash . Todas las modificaciones y capturas de pantalla son de Ramces Red.
Deja una respuesta