Éditeur de flux - Tampon de motif

L'une des opérations de base que nous effectuons sur n'importe quel fichier est d'afficher son contenu. Pour cela, nous pouvons utiliser leprintcommande qui imprime le contenu du tampon de motif. Alors, apprenons-en plus sur le tampon de motifs

Créez d'abord un fichier contenant le numéro de ligne, le nom du livre, son auteur et le nombre de pages. Dans ce tutoriel, nous utiliserons ce fichier. Vous pouvez utiliser n'importe quel fichier texte selon votre convenance. Notre fichier texte ressemblera à ceci:

[jerry]$ vi books.txt 
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

Maintenant, imprimons le contenu du fichier.

[jerry]$ sed 'p' 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 
1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864 
6) A Game of Thrones, George R. R. Martin, 864

Vous vous demandez peut-être pourquoi chaque ligne est affichée deux fois. Laissez-nous découvrir.

Vous souvenez-vous du flux de travail de SED? Par défaut, SED imprime le contenu du tampon de motifs. De plus, nous avons inclus une commande d'impression explicitement dans notre section de commande. Par conséquent, chaque ligne est imprimée deux fois. Mais ne t'inquiète pas. SED a le-noption pour supprimer l'impression par défaut du tampon de motif. La commande suivante illustre cela.

[jerry]$ sed -n 'p' 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

Toutes nos félicitations! nous avons obtenu le résultat attendu. Par défaut, SED fonctionne sur toutes les lignes. Mais nous pouvons forcer le SED à n'opérer que sur certaines lignes. Par exemple, dans l'exemple ci-dessous, SED ne fonctionne que sur la 3ème ligne. Dans cet exemple, nous avons spécifié une plage d'adresses avant la commande SED.

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

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

3) The Alchemist, Paulo Coelho, 197

De plus, nous pouvons également demander à SED d'imprimer uniquement certaines lignes. Par exemple, le code suivant imprime toutes les lignes de 2 à 5. Ici, nous avons utilisé l'opérateur virgule (,) pour spécifier la plage d'adresses.

[jerry]$ sed -n '2,5 p' books.txt

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

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

Il existe également un caractère spécial Dollar ($) qui représente la dernière ligne du fichier. Alors imprimons la dernière ligne du fichier.

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

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

6) A Game of Thrones, George R. R. Martin, 864

Cependant, nous pouvons également utiliser le caractère Dollar ($) pour spécifier la plage d'adresses. L'exemple ci-dessous imprime la ligne 3 jusqu'à la dernière ligne.

[jerry]$ sed -n '3,$ p' books.txt

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

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

Nous avons appris à spécifier une plage d'adresses à l'aide de l'opérateur virgule (,). SED prend en charge deux autres opérateurs qui peuvent être utilisés pour spécifier la plage d'adresses. Le premier est l'opérateur plus (+) et il peut être utilisé avec l'opérateur virgule (,). Par exempleM, +n imprimera le prochain n lignes à partir du numéro de ligne M. Cela semble déroutant? Vérifions-le avec un exemple simple. L'exemple suivant imprime les 4 lignes suivantes à partir de la ligne numéro 2.

[jerry]$ sed -n '2,+4 p' books.txt

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

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

En option, nous pouvons également spécifier une plage d'adresses à l'aide de l'opérateur tilde (~). Il utiliseM~nforme. Il indique que SED doit commencer à la ligne numéro M et traiter chaque n (ième) ligne. Par exemple,50~5correspond aux numéros de ligne 50, 55, 60, 65, etc. Imprimons uniquement les lignes impaires du fichier.

[jerry]$ sed -n '1~2 p' 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 
3) The Alchemist, Paulo Coelho, 197 
5) The Pilgrimage, Paulo Coelho, 288

Le code suivant imprime uniquement les lignes paires du fichier.

[jerry]$ sed -n '2~2 p' books.txt

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

2) The Two Towers, J. R. R. Tolkien, 352 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
6) A Game of Thrones, George R. R. Martin, 864