Éditeur de flux - Boucles

Comme d'autres langages de programmation, SED fournit également une fonction de bouclage et de branchement pour contrôler le flux d'exécution. Dans ce chapitre, nous allons explorer plus en détail comment utiliser les boucles et les branches dans SED.

Une boucle dans SED fonctionne comme une boucle gotodéclaration. SED peut sauter à la ligne marquée par l'étiquette et continuer à exécuter les commandes restantes. Dans SED, nous pouvons définir unlabel comme suit:

:label 
:start 
:end 
:up

Dans l'exemple ci-dessus, un nom après deux-points (:) implique le nom de l'étiquette.

Pour passer à une étiquette spécifique, nous pouvons utiliser le bcommande suivie du nom de l'étiquette. Si le nom d'étiquette est omis, le SED saute à la fin du fichier SED.

Écrivons un simple script SED pour comprendre les boucles et les branches. Dans notre fichier books.txt, il y a plusieurs entrées de titres de livres et de leurs auteurs. L'exemple suivant combine un titre de livre et son nom d'auteur sur une ligne séparée par une virgule. Ensuite, il recherche le motif "Paulo". Si le motif correspond, il imprime un trait d'union (-) devant la ligne, sinon il saute auPrint étiquette qui imprime la ligne.

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

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

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

À première vue, le script ci-dessus peut sembler cryptique. Laissez-nous démystifier cela.

  • Les deux premières commandes sont explicites h;n;H;x et s/\n/, / combinez le titre du livre et son auteur séparés par une virgule (,).

  • La troisième commande saute à l'étiquette Print uniquement lorsque le motif ne correspond pas, sinon la substitution est effectuée par la quatrième commande.

  • :Print est juste un nom d'étiquette et comme vous le savez déjà, p est la commande d'impression.

Pour améliorer la lisibilité, chaque commande SED est placée sur une ligne distincte. Cependant, on peut choisir de placer toutes les commandes sur une seule ligne comme suit:

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

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

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