Editor de secuencias: bucles

Al igual que otros lenguajes de programación, SED también proporciona una función de bucle y ramificación para controlar el flujo de ejecución. En este capítulo, exploraremos más sobre cómo usar bucles y ramas en SED.

Un bucle en SED funciona de manera similar a un gotodeclaración. El SED puede saltar a la línea marcada por la etiqueta y continuar ejecutando los comandos restantes. En SED, podemos definir unlabel como sigue:

:label 
:start 
:end 
:up

En el ejemplo anterior, un nombre después de dos puntos (:) implica el nombre de la etiqueta.

Para saltar a una etiqueta específica, podemos usar el bcomando seguido del nombre de la etiqueta. Si se omite el nombre de la etiqueta, el SED salta al final del archivo SED.

Escribamos un script SED simple para comprender los bucles y las ramas. En nuestro archivo books.txt, hay varias entradas de títulos de libros y sus autores. El siguiente ejemplo combina el título de un libro y el nombre de su autor en una línea separados por una coma. Luego busca el patrón "Paulo". Si el patrón coincide, imprime un guión (-) delante de la línea; de lo contrario, salta alPrint etiqueta que imprime la línea.

[jerry]$ sed -n ' 
h;n;H;x 
s/\n/, / 
/Paulo/!b Print 
s/^/- / 
:Print 
p' books.txt

Al ejecutar el código anterior, obtiene el siguiente resultado:

A Storm of Swords, George R. R. Martin 
The Two Towers, J. R. R. Tolkien 
- The Alchemist, Paulo Coelho 
The Fellowship of the Ring, J. R. R. Tolkien 
- The Pilgrimage, Paulo Coelho
A Game of Thrones, George R. R. Martin

A primera vista, el guión anterior puede parecer críptico. Desmitifiquemos esto.

  • Los dos primeros comandos se explican por sí mismos h;n;H;x y s/\n/, / combine el título del libro y su autor separados por una coma (,).

  • El tercer comando salta a la etiqueta Print sólo cuando el patrón no coincide; de ​​lo contrario, el cuarto comando realiza la sustitución.

  • :Print es solo un nombre de etiqueta y, como ya sabe, p es el comando de impresión.

Para mejorar la legibilidad, cada comando SED se coloca en una línea separada. Sin embargo, se puede optar por colocar todos los comandos en una línea de la siguiente manera:

[jerry]$ sed -n 'h;n;H;x;s/\n/, /;/Paulo/!b Print; s/^/- /; :Print;p' books.txt

Al ejecutar el código anterior, obtiene el siguiente resultado:

A Storm of Swords, George R. R. Martin 
The Two Towers, J. R. R. Tolkien 
- The Alchemist, Paulo Coelho 
The Fellowship of the Ring, J. R. R. Tolkien 
- The Pilgrimage, Paulo Coelho 
A Game of Thrones, George R. R. Martin