Editor de fluxo - Loops
Como outras linguagens de programação, o SED também fornece um recurso de loop e ramificação para controlar o fluxo de execução. Neste capítulo, vamos explorar mais sobre como usar loops e ramificações no SED.
Um loop em SED funciona semelhante a um gotodeclaração. O SED pode pular para a linha marcada pelo rótulo e continuar executando os comandos restantes. No SED, podemos definir umlabel do seguinte modo:
:label
:start
:end
:up
No exemplo acima, um nome após dois pontos (:) indica o nome do rótulo.
Para pular para um rótulo específico, podemos usar o bcomando seguido do nome do rótulo. Se o nome do rótulo for omitido, o SED vai para o final do arquivo SED.
Vamos escrever um script SED simples para entender os loops e ramificações. Em nosso arquivo books.txt, há várias entradas de títulos de livros e seus autores. O exemplo a seguir combina o título de um livro e seu nome de autor em uma linha separada por uma vírgula. Em seguida, procura o padrão "Paulo". Se o padrão corresponder, ele imprime um hífen (-) na frente da linha, caso contrário, salta para oPrint etiqueta que imprime a linha.
[jerry]$ sed -n '
h;n;H;x
s/\n/, /
/Paulo/!b Print
s/^/- /
:Print
p' books.txt
Ao executar o código acima, você obtém o seguinte 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
À primeira vista, o script acima pode parecer enigmático. Vamos desmistificar isso.
Os primeiros dois comandos são autoexplicativos h;n;H;x e s/\n/, / combine o título do livro e seu autor separados por uma vírgula (,).
O terceiro comando salta para o rótulo Print somente quando o padrão não coincide, caso contrário, a substituição é realizada pelo quarto comando.
:Print é apenas um nome de rótulo e como você já sabe, p é o comando de impressão.
Para melhorar a legibilidade, cada comando SED é colocado em uma linha separada. No entanto, pode-se escolher colocar todos os comandos em uma linha da seguinte maneira:
[jerry]$ sed -n 'h;n;H;x;s/\n/, /;/Paulo/!b Print; s/^/- /; :Print;p' books.txt
Ao executar o código acima, você obtém o seguinte 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