Éditeur de flux - Gestion des modèles

Nous avons déjà discuté de l'utilisation du pattern et du hold buffer. Dans ce chapitre, nous allons explorer plus en détail leur utilisation. Laissez-nous discuter de lancommande qui imprime l'espace du motif. Il sera utilisé en conjonction avec d'autres commandes. Voici la syntaxe de la commande then.

[address1[,address2]]n

Prenons un exemple.

[jerry]$ sed 'n' books.txt

Lorsque le code ci-dessus est exécuté, il produira le résultat suivant:

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

le n La commande imprime le contenu du tampon de motif, efface le tampon de motif, récupère la ligne suivante dans le tampon de motif et y applique des commandes.

Considérons qu'il y a trois commandes SED avant n et deux commandes SED après n comme suit:

Sed command #1 
Sed command #2 
Sed command #3 
n command 
Sed command #4 
Sed command #5

Dans ce cas, SED applique les trois premières commandes sur le tampon de motif, efface le tampon de motif, récupère la ligne suivante dans le tampon de motif, et applique ensuite les quatrième et cinquième commandes sur celui-ci. C'est un concept très important. N'allez pas de l'avant sans avoir bien compris cela.

Le tampon de maintien contient des données, mais les commandes SED ne peuvent pas être appliquées directement sur le tampon de maintien. Par conséquent, nous devons amener les données du tampon de maintien dans le tampon de motif. SED fournit lexcommande pour échanger le contenu du motif et contenir les tampons. Les commandes suivantes illustrent lesx commander.

Modifions légèrement le fichier books.txt. Disons que le fichier contient des titres de livres suivis de leurs noms d'auteur. Après modification, le fichier devrait ressembler à ceci:

[jerry]$ cat 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

Echangeons le contenu des deux tampons. Par exemple, l'exemple suivant imprime uniquement les noms des auteurs.

[jerry]$ sed -n 'x;n;p' books.txt

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

George R. R. Martin 
J. R. R. Tolkien 
Paulo Coelho 
J. R. R. Tolkien 
Paulo Coelho 
George R. R. Martin

Voyons comment fonctionne cette commande.

  • Initialement, SED lit la première ligne, c'est-à-dire A Storm of Swords dans le tampon de motifs.

  • x La commande déplace cette ligne vers le tampon d'attente.

  • n récupère la ligne suivante, c'est-à-dire George RR Martin dans le tampon de motifs.

  • Le contrôle passe à la commande suivie de n qui imprime le contenu du tampon de motif.

  • Le processus se répète jusqu'à ce que le fichier soit épuisé.

Echangeons maintenant le contenu des tampons avant l'impression. Devinez, que se passe-t-il? Oui, il imprime les titres des livres.

[jerry]$ sed -n 'x;n;x;p' books.txt

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

A Storm of Swords 
The Two Towers 
The Alchemist 
The Fellowship of the Ring 
The Pilgrimage 
A Game of Thrones

le hLa commande traite le tampon de maintien. Il copie les données du tampon de motif vers le tampon de maintien. Les données existantes du tampon de conservation sont écrasées. Notez que lehLa commande ne déplace pas les données, elle ne copie que les données. Par conséquent, les données copiées restent telles quelles dans le tampon de motifs. Ci-dessous, la syntaxe duh commander.

[address1[,address2]]h

La commande suivante imprime uniquement les titres de l'auteur Paulo Coelho.

[jerry]$ sed -n '/Paulo/!h; /Paulo/{x;p}' books.txt

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

The Alchemist 
The Pilgrimage

Comprenons comment fonctionne la commande ci-dessus. Le contenu de books.txt suit un format spécifique. La première ligne est le titre du livre suivi de l'auteur du livre. Dans la commande ci-dessus, "!" est utilisé pour inverser la condition, c'est-à-dire que la ligne n'est copiée dans le tampon de maintien que lorsqu'une correspondance de motif échoue. Et les accolades {} sont utilisées pour regrouper plusieurs commandes SED

Lors du premier passage de la commande, SED lit la première ligne, c'est-à-dire A Storm of Swords, dans le tampon de motifs et vérifie s'il contient le motif Paulo ou non. Comme la correspondance de modèle échoue, il copie cette ligne dans le tampon de conservation. Maintenant, le tampon de motif et le tampon de maintien contiennent la même ligne, c'est-à-dire A Storm of Swords. Dans la deuxième étape, il vérifie si la ligne contient le motif Paulo ou non. Comme le motif ne correspond pas, il ne fait rien.

En deuxième passe, il lit la ligne suivante George RR Martin dans le tampon de motifs et applique les mêmes étapes. Pour les trois lignes suivantes, il fait la même chose. À la fin de la cinquième passe, les deux tampons contiennent l'Alchimiste. Au début de la sixième passe, il lit la ligne Paulo Coelho et lorsque le motif correspond, il ne copie pas cette ligne dans le tampon d'attente. Par conséquent, le tampon de motif contient Paulo Coelho et le tampon de maintien contient The Alchemist.

Ensuite, il vérifie si le tampon de motif contient le motif Paulo. Lorsque la correspondance de modèle réussit, elle échange le contenu du tampon de modèle avec le tampon de maintien. Maintenant, le tampon de motif contient The Alchemist et le tampon de maintien contient Paulo Coelho. Enfin, il imprime le contenu du tampon de motifs. Les mêmes étapes sont appliquées au modèle Le pèlerinage.

le hLa commande détruit le contenu précédent du tampon de conservation. Ce n'est pas toujours acceptable, car nous devons parfois préserver le contenu. À cette fin, SED fournit leHcommande qui ajoute le contenu au tampon de conservation en ajoutant une nouvelle ligne à la fin. La seule différence entreh et Hest, la première écrase les données du tampon de conservation, tandis que la dernière ajoute des données au tampon de conservation. Sa syntaxe est similaire à celleh commander.

[address1[,address2]]H

Prenons un autre exemple. Cette fois, au lieu d'imprimer uniquement les titres de livres, imprimez également les noms de leurs auteurs. L'exemple suivant imprime les titres des livres suivis de leurs noms d'auteur.

[jerry]$ sed -n '/Paulo/!h; /Paulo/{H;x;p}' books.txt

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

The Alchemist 
Paulo Coelho 
The Pilgrimage
Paulo Coelho

Nous avons appris comment copier / ajouter le contenu du tampon de motif pour contenir le tampon. Pouvons-nous également exécuter la fonction inverse? Oui certainement! À cette fin, SED fournit legcommande qui copie les données du tampon de maintien vers le tampon de motif. Lors de la copie, les données existantes de l'espace de motif sont écrasées. Ci-dessous, la syntaxe dug commander.

[address1[,address2]]g

Prenons le même exemple - l'impression des titres de livres et de leurs auteurs. Cette fois, nous imprimerons d'abord le nom de l'auteur et sur la ligne suivante, le titre du livre correspondant. La commande suivante imprime le nom de l'auteur Paulo Coelho, suivi du titre de son livre.

[jerry]$ sed -n '/Paulo/!h; /Paulo/{p;g;p}' books.txt

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

Paulo Coelho 
The Alchemist 
Paulo Coelho 
The Pilgrimage

La première commande est conservée telle quelle. À la fin de la cinquième passe, les deux tampons contiennent l'Alchimiste. Au début de la sixième passe, il lit la ligne Paulo Coelho et lorsque le motif correspond, il ne copie pas cette ligne dans le tampon d'attente. Par conséquent, l'espace de motif contient Paulo Coelho et l'espace de maintien contient l'Alchimiste.

Ensuite, il vérifie si l'espace de motif contient le motif Paulo. Lorsque la correspondance de motif réussit, il imprime d'abord le contenu de l'espace de motif, c'est-à-dire Paulo Coelho, puis il copie le tampon de maintien dans le tampon de motif. Par conséquent, les tampons de motif et de maintien contiennent l'Alchimiste. Enfin, il imprime le contenu du tampon de motifs. Les mêmes étapes sont appliquées au modèle Le pèlerinage.

De même, nous pouvons ajouter le contenu du tampon de maintien au tampon de motif. SED fournit leG commande qui ajoute le contenu au tampon de motif en ajoutant une nouvelle ligne à la fin.

[address1[,address2]]G

Prenons maintenant l'exemple précédent qui imprime le nom de l'auteur Paulo Coelhof suivi de son titre de livre. Pour obtenir le même résultat, exécutez la commande SED suivante.

[jerry]$ sed -n '/Paulo/!h; /Paulo/{G;p}' books.txt

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

Paulo Coelho 
The Alchemist 
Paulo Coelho 
The Pilgrimage

Pouvez-vous modifier l'exemple ci-dessus pour afficher les titres des livres suivis de leurs auteurs? Simple, échangez simplement le contenu du tampon avant leG commander.

[jerry]$ sed -n '/Paulo/!h; /Paulo/{x;G;p}' books.txt

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

The Alchemist 
Paulo Coelho 
The Pilgrimage 
Paulo Coelho