Éditeur de flux - Caractères spéciaux

SED fournit deux caractères spéciaux qui sont traités comme des commandes. Ce chapitre illustre l'utilisation de ces deux caractères spéciaux.

= Commande

La commande "=" traite des numéros de ligne. Voici la syntaxe de la commande "=":

[/pattern/]= 
[address1[,address2]]=

La commande = écrit le numéro de ligne suivi de son contenu sur le flux de sortie standard. L'exemple suivant illustre cela.

[jerry]$ sed '=' books.txt

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

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

Imprimons les numéros de ligne et le contenu des quatre premières lignes. La commande suivante imprime les quatre premières lignes avec les numéros de ligne et les autres sans numéros de ligne.

[jerry]$ sed '1, 4=' books.txt

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

1 
1) A Storm of Swords, George R. R. Martin, 1216 
2 
2) The Two Towers, J. R. R. Tolkien, 352 
3 
3) The Alchemist, Paulo Coelho, 197 
4 
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

De plus, nous pouvons demander au SED d'imprimer les numéros de ligne lorsqu'une correspondance de motif réussit. L'exemple suivant imprime le numéro de ligne qui contient le modèle «Paulo».

[jerry]$ sed '/Paulo/ =' books.txt

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

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

Pouvez-vous deviner ce que fait la commande SED suivante?

[jerry]$ sed -n '$ =' books.txt

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

6

Oui, tu as raison. Il compte le nombre total de lignes présentes dans le fichier. Démystifions le code. Dans la section de commande, nous avons utilisé "$ =" qui imprime le numéro de ligne de la dernière ligne suivi de son contenu. Mais nous avons également fourni le-n indicateur qui supprime l'impression par défaut du tampon de motif. Par conséquent, seul le dernier numéro de ligne est affiché.

& Commande

SED prend en charge le caractère spécial &. Chaque fois qu'une correspondance de modèle réussit, ce caractère spécial stocke le modèle correspondant. Il est souvent utilisé avec la commande de substitution. Voyons comment nous pouvons tirer parti de cette fonctionnalité efficace.

Chaque ligne du fichier book.txt est numérotée. Ajoutons les motsBook numberau début de chaque ligne. L'exemple suivant illustre cela.

[jerry]$ sed 's/[[:digit:]]/Book number &/' books.txt

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

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

Cet exemple est très simple. Tout d'abord, nous recherchons la première occurrence d'un chiffre, qui est le numéro de ligne (c'est pourquoi nous avons utilisé [[: digit:]]) et le SED stocke automatiquement le motif correspondant dans le caractère spécial &. Dans la deuxième étape, nous insérons les motsBook number avant chaque motif correspondant, c'est-à-dire avant chaque ligne.

Prenons un autre exemple. Dans le fichier book.txt, le dernier chiffre indique le nombre de pages du livre. Ajoutons "Pages =" avant cela. Pour ce faire, recherchez la dernière occurrence du chiffre et remplacez-la par "Pages = &". Ici, & stocke le modèle correspondant, c'est-à-dire le nombre de pages

[jerry]$ sed 's/[[:digit:]]*$/Pages = &/' books.txt

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

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

Pour le moment, souviens-toi juste que [[:digit:]]*$trouve la dernière occurrence du chiffre. Dans le chapitre «Expressions régulières, nous explorerons plus en détail les expressions régulières.