Comment utiliser Sed dans Linux

Sed est un programme UNIX simple qui ne crée ni n’édite des fichiers. Il ne modifie que les données qui transitent par son entrée et présente les données modifiées en sortie. Ici, nous allons aborder un bref aperçu de la philosophie UNIX, passer en revue les concepts de base de l’utilisation de sed et vous montrer des exemples de comment utiliser le programme pour des tâches quotidiennes.
Table des matières
- Les bases de l’utilisation de Sed
- Sélectionner et affiner les flux de texte
- Supprimer du texte d’un flux Sed
- Ajouter du nouveau texte aux flux Sed
- Trouver et remplacer du texte dans Sed
- Copier des données texte dans l’espace de retenue
- Utiliser des étiquettes pour créer des boucles dans Sed
- Effectuer des modifications permanentes dans Sed
Les bases de l’utilisation de Sed
Sed est un programme qui peut lire et modifier des flux de données texte. Cela signifie que, contrairement à un éditeur de texte classique, sed ne change pas directement les fichiers sur votre ordinateur. Au lieu de cela, il agit plus comme un “filtre” pour les données entrantes et vous permet de les transformer comme vous le souhaitez.
Pour commencer avec sed, créez d’abord un fichier contenant au moins cinq lignes de texte. Assurez-vous qu’il y a un caractère “nouvelle ligne” entre vos lignes :
printf"hello\nmaketecheasier\nworld\nthis\nis\nwonderful\n"> hello.txtNote : bien que ce guide utilise un fichier texte multi-lignes pour démontrer sed, toutes les sous-ordres dans le programme fonctionneront également sur le texte provenant de tuyaux UNIX.
La commande générale pour sed est quelque chose comme :
sed[option]'{script}'[fichier texte]Une des fonctions les plus basiques de sed est la sous-commande n. Elle fonctionne en lisant des données de l’entrée de sed et en les plaçant dans l’”espace modèle” de votre programme. C’est un tampon spécial qui contient tout texte entrant avant que sed ne l’altère :
sed n hello.txt
Une autre fonction de base de sed est la sous-commande p. Semblable à n, elle lit les données provenant de l’entrée de sed et les place dans l’espace modèle du programme. Cependant, elle les imprime également explicitement sur la sortie de votre terminal.
Utiliser la sous-commande p peut être déroutant pour les débutants puisque l’exécution de celle-ci avec n’importe quelle entrée texte entraîne sed à imprimer sa sortie deux fois. C’est parce que, par défaut, sed imprime automatiquement son espace modèle que p soit présent ou non :
sed p hello.txt
Pour désactiver ce comportement étrange, ajoutez le drapeau -n avant d’exécuter vos sous-commandes sed :
sed-n p hello.txt
Avec les bases en place, les sections suivantes examineront les différentes manières dont vous pouvez utiliser sed pour manipuler des données texte.
1. Sélectionner et affiner les flux de texte
En plus d’imprimer, vous pouvez également utiliser sed pour sélectionner et affiner le texte à partir de flux de données et de fichiers. Le moyen le plus simple de le faire est d’ajouter une valeur d’intervalle à la sous-commande p.
La commande suivante utilise la syntaxe d’intervalle de sed pour imprimer la troisième à la cinquième ligne de votre fichier “hello.txt” :
sed-n'3,5p' hello.txt
Vous pouvez également utiliser la sous-commande p pour imprimer des lignes non adjacentes dans votre texte. Par exemple, la suivante imprime la première et la quatrième ligne du fichier “hello.txt” :
sed-n'1p; 4p' hello.txt2. Supprimer du texte d’un flux Sed
Sed peut également supprimer des données de n’importe quel flux texte entrant. Cela est utile si vous souhaitez soit supprimer quelques lignes de texte d’un grand fichier, soit nettoyer la sortie d’un programme pour ne montrer que les informations dont vous avez besoin.
Pour ce faire, utilisez la sous-commande d avec le numéro de ligne spécifique ou l’intervalle que vous souhaitez supprimer :
sed-n'2d; 5d; p' hello.txt
Tout comme l’impression des lignes de texte, la sous-commande d fonctionne avec des intervalles multi-lignes. Par exemple, la commande suivante supprimera les quatre premières lignes du fichier “hello.txt” :
sed-n'1,4d; p' hello.txtEn plus de faire correspondre des intervalles de lignes spécifiques, vous pouvez utiliser des expressions régulières pour trouver le texte que vous souhaitez supprimer. Cela indiquera à sed de rechercher les lignes contenant le mot “world” et de les supprimer :
sed-n'/world/ d; p' hello.txtVous pouvez également traiter les expressions régulières comme un intervalle pour votre fichier d’entrée. Cela vous donne plus de flexibilité dans la définition de vos sélections au sein du programme :
sed-n'/world/,/wonderful/ d; p' hello.txt
3. Ajouter du nouveau texte aux flux Sed
En plus de supprimer du texte, sed est également capable d’ajouter du nouveau texte aux flux de données existants. Bien que cela ne soit pas au niveau d’un éditeur de texte complet, cette fonctionnalité peut néanmoins être utile pour des modifications ponctuelles et des ajouts de texte de base.
Pour ajouter une nouvelle ligne de texte, exécutez sed avec la commande a suivie du texte que vous voulez ajouter :
sed-ne'$a hello'-e'p' hello.txt
Note : le drapeau -e indique à sed que la chaîne entre guillemets qui le suit est une expression sed. Cela vous permet d’enchaîner plusieurs expressions ensemble sans invoquer sed plusieurs fois.
Il est également possible d’inclure des fichiers entiers dans un flux texte sed. Pour ce faire, utilisez la commande r suivie du nom du fichier que vous souhaitez ajouter :
sed-ne'$r welcome.txt'-e'p' hello.txt
4. Trouver et remplacer du texte dans Sed
L’une des fonctionnalités les plus puissantes de sed est sa capacité à trouver et remplacer du texte dans un flux texte. Contrairement à l’ajout et à la suppression de texte, cela vous permet de modifier dynamiquement les données au fur et à mesure qu’elles passent par des tuyaux UNIX, ce qui le rend beaucoup plus flexible par rapport à un éditeur de texte classique.
Commencez par imprimer votre texte d’entrée sans aucune modification de sed :
sed-ne'p' hello.txt
Remplacez la sous-commande p par s, puis ajoutez trois barres obliques (/) après celle-ci :
sed-ne's///'-e'p' hello.txtInsérez une expression régulière structurelle de la chaîne de caractères que vous souhaitez faire correspondre entre la première et la deuxième barre oblique. Par exemple, je peux mettre la valeur suivante pour chercher des mots qui commencent par “wo” dans ma chaîne d’entrée :
sed-ne's/wo*.//'-e'p' hello.txtPlacez votre curseur de texte entre la deuxième et la troisième barre oblique, puis fournissez le texte avec lequel vous souhaitez remplacer vos correspondances. Contrairement à la colonne précédente, cette section n’utilise pas d’expressions régulières structurelles :
sed-ne's/wo.*/website/'-e'p' hello.txtPar défaut, sed ne remplace que la première chaîne qu’il correspond sur une ligne particulière. Cela peut poser un problème si vous souhaitez remplacer chaque instance d’un mot dans votre flux texte. Pour y remédier, ajoutez l’option g après la troisième barre oblique de votre expression :
sed-ne's/wo.*/website/g'-e'p' hello.txt
5. Copier des données texte dans l’espace de retenue
Sed utilise deux tampons pour stocker des données texte : l’espace modèle et l’espace de retenue. Le premier sert de place temporaire pour votre texte tandis qu’il passe à travers les expressions sed. En attendant, le second sert de presse-papiers où vous pouvez stocker des données texte arbitraires.
Un avantage de cette approche est qu’elle vous permet de “retenir” certaines sorties sans avoir recours à des programmes externes. Cela peut être utile si vous prévoyez d’utiliser sed pour traiter des manipulations de texte en plusieurs étapes.
Pour commencer à utiliser les espaces de retenue, assurez-vous d’avoir un fichier contenant au moins quelques lignes de texte à l’intérieur :
sed-ne'p' hello.txtRemplacez la sous-commande p par h, puis fournissez soit un numéro de ligne, soit une valeur regex que sed fera correspondre dans votre fichier. Cela indiquera à sed de prendre cette ligne de texte spécifique et de la copier dans son espace de retenue :
sed-ne'3h' hello.txtNote : les données à l’intérieur d’un espace de retenue ne persistent pas à travers différentes commandes sed.
Vous pouvez également utiliser la sous-commande H pour stocker plusieurs lignes de texte dans votre espace de retenue. Par exemple, la commande suivante stocke la troisième et la quatrième ligne de mon fichier texte et les imprime à nouveau dans le terminal :
sed-ne'3,4H; $ {x; p}' hello.txt
6. Utiliser des étiquettes pour créer des boucles dans Sed
Bien que sed ne soit pas un langage de programmation complet, il est tout de même possible de créer des boucles à l’intérieur du programme. Cela est utile si vous avez besoin d’une expression sed qui doit continuellement parcourir un morceau de texte d’entrée particulier.
Pour créer une boucle dans sed, vous devez d’abord créer une étiquette pour votre expression sed. Pour cela, vous devez utiliser la sous-commande : suivie de l’étiquette que vous souhaitez utiliser pour votre expression.
sed-e':x' hello.txtFournissez les critères de correspondance pour votre expression sed. Dans mon cas, je veux qu’elle aille à la fin de chaque ligne dans mon texte d’entrée :
sed-e':x; $' hello.txtTapez les sous-commandes sed que vous souhaitez exécuter chaque fois que sed trouve une correspondance, puis enfermez-les dans des accolades. Ce qui suit relie deux lignes adjacentes, remplace le caractère de nouvelle ligne par un espace, puis revient au début de l’expression :
sed-e':x; /$/ {N; s/\n/ /g; bx}' hello.txt
Vous pouvez même étendre cela pour faire correspondre presque n’importe quel type de texte d’entrée. Par exemple, la commande suivante utilise la fonctionnalité d’expressions régulières étendues de sed pour supprimer les balises HTML de votre texte d’entrée :
sed-re':x; s/<[^>]*>//g; {N; bx}' hello.html
7. Effectuer des modifications permanentes dans Sed
Tout comme avec tout autre outil UNIX, sed peut profiter de la redirection de sortie et des tuyaux. Cela permet non seulement de relier sed à d’autres programmes, mais cela vous donne aussi l’opportunité de rendre vos modifications permanentes.
La ligne de code suivante crée un nouveau fichier “welcome.txt” à partir de la sortie de ma commande sed :
sed-ne'2p; 6p' hello.txt > hi.txt
En plus de la redirection de sortie, vous pouvez également utiliser le drapeau -i intégré pour modifier votre fichier actuel au lieu de sortir vos modifications dans la console de votre terminal. Par exemple, la commande suivante supprime tous les caractères de nouvelle ligne de mon fichier texte et l’enregistre :
sed-ie':x; $; {N; s/\n/ /g; bx}' hello.txt
Si toute cette discussion vous a intrigué avec la ligne de commande Linux. Vous pouvez lire notre article précédent où nous parlons de quelques-uns des invites Bash les plus intéressantes que vous pouvez utiliser aujourd’hui.