Nombreux sont les uti­li­sa­teurs de Linux et de ses multiples dis­tri­bu­tions qui tra­vail­lent oc­ca­sion­nel­le­ment ou ré­gu­liè­re­ment en utilisant la ligne de commande. Avec le terminal, il est possible d’effectuer des tâches plus rapides ou de meilleure qualité qu’avec l’interface graphique. Pour y parvenir, vous devez cependant connaître les dif­fé­rentes commandes, ainsi que le fonc­tion­ne­ment de celles-ci. Sous Linux, l’une de ces commandes est appelée « sed ».

Le « Stream Editor » (« sed » dans sa forme abrégée) est un éditeur de texte, mais il est différent des autres logiciels répondant à cette ap­pel­la­tion. Sous Linux, vous pouvez utiliser la commande SED pour lire et modifier vos flux de données. Cet outil est donc prin­ci­pa­le­ment utilisé dans le cadre de la pro­gram­ma­tion shell. Comment cette commande fonc­tionne-t-elle ?

À quoi sert la commande SED sous Linux ?

La commande « sed » est incluse dans chaque ins­tal­la­tion Linux, puisqu’elle ap­par­tient au paquetage GNU Core Utilities (« Coreutils »). Cet outil est un éditeur de texte non in­te­rac­tif : aucune mo­di­fi­ca­tion n’est apportée di­rec­te­ment au fichier que vous êtes en train de traiter. Vous créez d’abord un fichier tem­po­raire, puis son contenu est transféré dans le fichier d’origine. La commande SED de Linux fonc­tionne ligne par ligne : chaque ligne d’un fichier est lue, traitée et restituée in­di­vi­duel­le­ment. La prin­ci­pale fonction de la commande SED consiste à re­cher­cher certaines chaînes de ca­rac­tères pour les remplacer par d’autres ca­rac­tères.

De cette façon, vous pouvez pro­fon­dé­ment modifier l’in­té­gra­lité d’un fichier à l’aide d’une seule commande, et ce, presque au­to­ma­ti­que­ment. En intégrant des commandes de ce type dans un script shell, vous pouvez con­si­dé­ra­ble­ment sim­pli­fier vos tâches ré­pé­ti­tives. Ainsi, vous pouvez par exemple en­tre­te­nir vos bases de données ou un code source étendu. Plutôt que de modifier ma­nuel­le­ment chaque entrée, utilisez la commande SED pour parcourir l’ensemble du fichier en une seule fois.

Syntaxe et fonction de la commande SED

La commande SED fonc­tionne à l’aide d’autres commandes. Elle est utilisée sur des fichiers. Cette commande et toutes celles qui lui sont associées peuvent être amé­lio­rées par des options.

sed [Option(s)] ’Commande(s)’ [Fichier(s)]

Vous pouvez choisir de les saisir di­rec­te­ment dans la commande ou de les lire à partir d’un fichier. Si vous choi­sis­sez la seconde option, entrez le chemin du fichier en lieu et place de la commande.

Options

Comme c’est souvent le cas avec les commandes sous Linux, vous avez aussi la pos­si­bi­lité de définir des pa­ra­mètres en utilisant la commande SED. Ces pa­ra­mètres sont par­ti­cu­liè­re­ment im­por­tants pour la commande SED, car ils sont les seuls à pouvoir vous indiquer la manière dont vous devez in­ter­pré­ter la commande suivante. Les options suivantes sont à votre dis­po­si­tion :

Option Ex­pli­ca­tion
-e Indique l’uti­li­sa­tion d’un ou de plusieurs scripts SED.
-f Indique que le script est extrait d’un fichier.
-n Indique que les résultats ne sont pas restitués.
-i Indique la création d’un fichier tem­po­raire destiné à remplacer le fichier d’origine.
-u Indique qu’aucun tampon de données n’est utilisé.
-s Indique que plusieurs fichiers sont traités sé­pa­ré­ment plutôt que con­si­dé­rés comme un long flux de données.
-r Indique que la commande accepte les ex­pres­sions ré­gu­lières étendues.

Les options -e et -f sont les plus im­por­tantes. Elles vous indiquent si la commande se trouve di­rec­te­ment dans la commande SED (il s’agit alors d’un script SED) ou si celle-ci doit recourir à un fichier sup­plé­men­taire. Il est souvent possible de se passer de l’option -e dans les cas standard. Cependant, dès lors que plusieurs commandes sont intégrées en même temps à la commande SED, l’option doit être activée.

Note

Si vous utilisez l’option -e, le paramètre doit être écrit di­rec­te­ment avant la première commande. Si vous souhaitez utiliser d’autres options, vous devez également les écrire avant les commandes. Pour inclure d’autres commandes à la commande SED, ajoutez également l’option devant chacune d’elles.

En plus d’être ex­trê­me­ment im­por­tante, l’option -n est pro­ba­ble­ment es­sen­tielle à votre travail. Si le paramètre n’est pas défini, toutes les lignes du fichier texte en cours de lecture s’affichent dans le terminal, alors que ce n’est pas par­ti­cu­liè­re­ment utile pour les bases de données vo­lu­mi­neuses. Si vous décidez d’activer l’option, seules les lignes con­cer­nées par la commande s’affichent.

Commandes

Les commandes vous per­met­tent d’indiquer à la commande SED ce qu’elle doit accomplir vis-à-vis du fichier d’origine, et ce, en prenant en compte les options spé­ci­fiées.

Commande Des­crip­tion
a append : ajoute une ou plusieurs autres lignes aux lignes déjà sé­lec­tion­nées.
c change : modifie les lignes sé­lec­tion­nées à l’aide de nouveaux contenus.
d delete : supprime les lignes sé­lec­tion­nées.
g get : copie le contenu de l’espace de stockage dans l’espace de travail.
G Get­New­line : ajoute le contenu de l’espace de stockage à l’espace de travail.
h hold : copie le contenu de l’espace de travail dans l’espace de stockage.
H Hold­New­Line : ajoute le contenu de l’espace de travail à l’espace de stockage.
i insert : insère une ou plusieurs lignes avant les lignes sé­lec­tion­nées.
l listing : affiche l’ensemble des ca­rac­tères non im­pri­mables.
n next : passe à la commande suivante sur une nouvelle ligne de commande.
p print : affiche les lignes sé­lec­tion­nées.
q quit : quitte la commande SED de Linux.
r read : lit toutes les lignes sé­lec­tion­nées d’un fichier.
s subs­ti­tute : remplace une chaîne de ca­rac­tères spécifiée par une autre.
x xchange : in­ter­ver­tit l’espace de travail et l’espace de stockage.
y yank : remplace un caractère spécifié par un autre.
w write : écrit des lignes dans un fichier texte.
! Negation : applique la commande aux lignes ne cor­res­pon­dant pas à la saisie.
Remarque

L’espace de stockage et l’espace de travail ont tous deux des tâches dif­fé­rentes : l’espace de travail cor­res­pond à une mémoire vive à court terme. Il contient les données avec les­quelles la commande fonc­tionne à l’instant t. L’espace de stockage est quant à lui conçu pour le long terme. Les données qui s’y trouvent peuvent toujours être appelées, même si la commande SED est déjà occupée par ailleurs.

Les commandes peuvent également être enrichies par dif­fé­rentes options :

Option Des­crip­tion
= Indique le numéro de ligne des lignes sé­lec­tion­nées.
p Affiche les lignes modifiées.
g Applique la commande à l’in­té­gra­lité du fichier.
Remarque

Vos commandes doivent toujours être entourées par des guil­le­mets simples. Cela vous permet d’éviter à la saisie d’être réin­ter­pré­tée. Ces ca­rac­tères ne sont en principe pas né­ces­saires, mais ils éliminent toutefois nombre de sources d’erreur.

Ex­pres­sions ré­gu­lières

Pour utiliser la commande SED, il est essentiel de com­prendre les ex­pres­sions ré­gu­lières. Ces ca­rac­tères servent à indiquer à votre commande la manière dont elle doit traiter une séquence de ca­rac­tères. Les crochets et les pa­ren­thèses sont par exemple par­ti­cu­liè­re­ment im­por­tants à cet effet.

  • [ABC] : une classe de ca­rac­tères peut être utilisée pour re­cher­cher une cor­res­pon­dance à partir d’un groupe de lettres, de chiffres ou de symboles ; soit A, soit B, soit C.
  • (ABC) : Un groupe de ca­rac­tères cor­res­pond à un terme fixe, ici « ABC » (dans cet ordre).

Dans le cas des ex­pres­sions ré­gu­lières, les ca­rac­tères gé­né­riques per­met­tent aussi de re­cher­cher uni­que­ment certaines parties d’un terme. Deux variantes dif­fé­rentes sont à votre dis­po­si­tion.

  • . : le point peut remplacer exac­te­ment un caractère.
  • * : l’as­té­risque peut remplacer n’importe quel nombre de ca­rac­tères.

En outre, les ex­pres­sions ré­gu­lières vous donnent la pos­si­bi­lité de dé­ter­mi­ner plus pré­ci­sé­ment la fréquence des (com­bi­nai­sons de) ca­rac­tères.

  • ? : le point d’in­ter­ro­ga­tion indique qu’un terme peut tout aussi bien ap­pa­raître une fois que pas du tout.
  • + : le signe « plus » indique que le caractère concerné peut ap­pa­raître plusieurs fois (mais au minimum une fois).
  • {0,n} : mettre un nombre entre accolades revient à spécifier exac­te­ment la fréquence à laquelle une com­bi­nai­son de ca­rac­tères peut ap­pa­raître. En sai­sis­sant deux valeurs séparées par une virgule, vous dé­ter­mi­nez le minimum et le maximum de ré­pé­ti­tions possibles.

Enfin, lorsque vous utilisez la commande SED sous Linux, vous pouvez aussi ajouter des ca­rac­tères logiques ; ceux-ci peuvent par exemple vous aider à imbriquer des requêtes ou à les relier entre elles.

  • | : la barre verticale sépare deux termes et re­pré­sente une al­ter­na­tive entre les deux.
  • ^ : l’accent cir­con­flexe placé di­rec­te­ment avant un terme permet d’ignorer ce dernier ; cette chaîne de ca­rac­tères ne doit donc pas ap­pa­raître.

Vous pouvez utiliser ces ca­rac­tères pour modifier votre saisie dans la commande SED, et ainsi accomplir des tâches complexes.

Adresses

Dans le cas de la commande SED de Linux, ces saisies sont appelées des adresses. Une adresse est donc con­si­dé­rée comme la cible de votre commande. Vous disposez de dif­fé­rentes pos­si­bi­li­tés pour spécifier celle-ci. Dans bon nombre de si­tua­tions, vous pouvez in­tro­duire des requêtes amé­lio­rées à l’aide d’ex­pres­sions ré­gu­lières. Mais, par exemple, vous pouvez aussi sé­lec­tion­ner des lignes di­rec­te­ment dans le fichier texte. Il vous suffit ensuite de ren­seig­ner les dif­fé­rentes adresses en con­sé­quence.

Le premier exemple se rapporte donc à des lignes spé­ci­fiques :

sed -n ’10,50p’ text.txt

Ce code peut par exemple vous permettre de trans­mettre les lignes 10 à 50 au terminal.

Si vous n’êtes pas en mesure d’iden­ti­fier pré­ci­sé­ment les lignes qui con­tien­nent les in­for­ma­tions avec les­quelles vous voulez tra­vail­ler, vous pouvez effectuer une recherche à partir de l’adresse. Il est essentiel que vos ex­pres­sions soient toujours entourées par des barres obliques. Celles-ci vous per­met­tent de séparer le véritable terme de recherche réel d’autres in­for­ma­tions, comme les commandes.

sed -n ’exemple.[1-9]/p’ text.txt

Ce code vous indique toutes les lignes con­si­dé­rées comme un ou des exemples et suivies par un chiffre.

La commande SED expliquée à l’aide de trois exemples

La commande SED peut ra­pi­de­ment vous aider dans un grand nombre de si­tua­tions. Cet outil prend réel­le­ment tout son sens lorsque vous devez, en une fois, apporter de nom­breuses mo­di­fi­ca­tions à des fichiers texte vo­lu­mi­neux. Les trois exemples suivants décrivent dif­fé­rentes manières d’intégrer la commande SED de Linux à votre uti­li­sa­tion quo­ti­dienne.

Recherche d’un fichier texte

Le plus simple des cas d’uti­li­sa­tion consiste à re­cher­cher des données spé­ci­fiques au sein d’un document. Celui-ci peut par exemple s’avérer in­té­res­sant dans des bases de données étendues ou dans du code source. Il vous permet de trouver ra­pi­de­ment trouver un passage, que vous sou­hai­tiez sim­ple­ment le lire ou également le modifier.

Essayez à présent d’imaginer que vous re­cher­chez une bouteille de Char­don­nay dans votre grande cave à vin et que vous souhaitez, en outre, afficher la première ligne de la base de données ex­pli­quant la ré­par­ti­tion en colonnes de celle-ci. Voici la commande pouvant vous aider à trouver la position de vos bou­teilles :

sed -n -e ’1p’ -e ’/Chardonnay/p’ vin.txt

Ici, vous utilisez bien deux commandes l’une après l’autre. Ces deux commandes sont in­tro­duites par l’option -e. Et voici ce à quoi ressemble votre résultat :

Étagère Région de culture Cépage Millésime
1 Rhénanie-Palatinat Chardonnay 2001
2 Moselle Chardonnay 1983
3 Alsace Chardonnay 1981

Si vous souhaitez uni­que­ment afficher les bou­teilles datant des années 1980, il vous suffit de modifier lé­gè­re­ment votre code.

sed -n -e ’1p’ -e ’/Chardonnay * 198./p’ vin.txt
Regal Anbaugebiet Rebsorte Jahrgang
2 Moselle Chardonnay 1983
3 Alsace Chardonnay 1981

En principe, le caractère générique séparant le cépage du millésime n’est pas important pour cet exemple. Cependant, si votre base de données est erronée ou si vous décidez après coup d’y ajouter une colonne, ce caractère garantit l’exac­ti­tude de ces in­for­ma­tions.

Ajout d’in­for­ma­tions

La commande SED sous Linux vous permet également d’enrichir vos bases de données. Pour créer de nouvelles entrées, il n’est pas né­ces­saire d’ouvrir, de modifier et d’en­re­gis­trer votre fichier à l’aide un éditeur de texte complet. À la place, il vous suffit d’une seule ligne de code pour apporter une mo­di­fi­ca­tion.

Toujours selon cet exemple, imaginez que vous recevez deux bou­teilles de vin à ajouter à votre col­lec­tion. Bien entendu, vous souhaitez intégrer celles-ci à votre base de données. Grâce à la commande SED, il vous suffit d’ajouter une nouvelle ligne à la fin de votre fichier texte.

sed -i -e ’$a2 Moselle Dornfelder 2010’ -e ’$a4 Alsace Pinot Gris 2011’ vin.txt

L’ex­pres­sion régulière $ permet à la commande SED de passer d’abord à cette dernière ligne. La commande entraîne l’ajout d’une nouvelle ligne avec le contenu qui s’ensuit. Vous pouvez utiliser l’option -i pour modifier di­rec­te­ment le fichier d’origine. À défaut, vous pouvez choisir de créer une nouvelle base de données :

sed -e ’$a2 Moselle Dornfelder 2010’ -e ’$a4 Alsace Pinot Gris 2011’ vin.txt > vin1.txt

Entretien des bases de données

Il peut s’avérer difficile de modifier après coup et ma­nuel­le­ment la structure d’une grande base de données contenant énor­mé­ment d’entrées. La commande SED de Linux vous offre une solution rapide à cet effet. Jusqu’à main­te­nant, les dif­fé­rentes colonnes de votre fichier étaient séparées les unes des autres à l’aide d’un espace. Dans cet exemple, imaginez que vous voulez remplacer cet espace par un tiret. Vous pouvez utiliser la commande s à cet effet :

sed -i -e ’s/[[:space:]]/-/g’ vin.txt

Le g que vous voyez à la fin de l’adresse garantit l’ap­pli­ca­tion de la commande à l’in­té­gra­lité du fichier.

L’insertion d’in­for­ma­tions sup­plé­men­taires sur une ligne peut également s’avérer délicate. Imaginez à présent, toujours selon cet exemple, que vous souhaitez désormais pouvoir préciser si le vin a déjà été goûté ou non. Avant d’ajouter de nouveaux vins inconnus à votre col­lec­tion, commencez par indiquer que tous les vins ont déjà été testés.

sed -i -e ’s/$/-connu/g’ vin.txt

Cet in­di­ca­teur est donc inséré sur toutes les lignes, y compris sur la première ligne contenant le nom des colonnes. Pour changer cela, effectuez un nouveau rem­pla­ce­ment au niveau de la première ligne.

sed -i -e ’1s/connu/goûté/’ vin.txt

Al­ter­na­tives à la commande SED

La commande SED de Linux est un outil puissant que vous pouvez utiliser pour accomplir un grand nombre de tâches diverses. Cependant, la réa­li­sa­tion de certaines d’entre elles peut s’avérer très fas­ti­dieuse et né­ces­si­ter de mettre en place quelques astuces. Par ailleurs, il est en­vi­sa­geable de parvenir aux mêmes résultats avec des commandes si­mi­laires, le tout plus ra­pi­de­ment et en toute sécurité.

AWK

L’outil AWK est présenté comme étant une amé­lio­ra­tion de la commande SED. Cette commande vous permet elle aussi d’utiliser des ex­pres­sions ré­gu­lières, mais offre également des options sup­plé­men­taires prises en charge par des langages de pro­gram­ma­tion plus complexes. Avec la commande AWK, vous pouvez aussi compiler des commandes com­por­tant des ins­truc­tions « if… else » ou des boucles « do… while ».

PERL

Si l’outil AWK est avant tout axé sur le langage C, une autre commande fonc­tionne sur la base du langage PERL. Même si PERL peut être utilisé pour créer des systèmes complexes, ce langage est également adapté à la réa­li­sa­tion de tâches moins im­por­tantes au sein du terminal ou des scripts bash.

TR

Pour trans­for­mer les ca­rac­tères in­di­vi­duels d’un fichier texte, il existe d’autres solutions que la commande SED : l’outil TR (forme abrégée de « translate », qui signifie « traduire ») est conçu pour remplacer par d’autres des lettres, des chiffres ou encore des ca­rac­tères spéciaux. Cette commande vous permet par exemple de supprimer ra­pi­de­ment tout double espace ou de modifier les ma­jus­cules / mi­nus­cules. Ces petites tâches sont très faciles à accomplir en utilisant la commande TR, mais les tâches plus complexes re­quiè­rent l’uti­li­sa­tion de solutions telles que la commande SED.

Aller au menu principal