Comment fonctionne la commande SED de Linux ?

Nombreux sont les utilisateurs de Linux et de ses multiples distributions qui travaillent occasionnellement ou régulièrement 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 différentes commandes, ainsi que le fonctionnement 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 appellation. Sous Linux, vous pouvez utiliser la commande SED pour lire et modifier vos flux de données. Cet outil est donc principalement utilisé dans le cadre de la programmation shell. Comment cette commande fonctionne-t-elle ?

À quoi sert la commande SED sous Linux ?

La commande « sed » est incluse dans chaque installation Linux, puisqu’elle appartient au paquetage GNU Core Utilities (« Coreutils »). Cet outil est un éditeur de texte non interactif : aucune modification n’est apportée directement au fichier que vous êtes en train de traiter. Vous créez d’abord un fichier temporaire, puis son contenu est transféré dans le fichier d’origine. La commande SED de Linux fonctionne ligne par ligne : chaque ligne d’un fichier est lue, traitée et restituée individuellement. La principale fonction de la commande SED consiste à rechercher certaines chaînes de caractères pour les remplacer par d’autres caractères.

De cette façon, vous pouvez profondément modifier l’intégralité d’un fichier à l’aide d’une seule commande, et ce, presque automatiquement. En intégrant des commandes de ce type dans un script shell, vous pouvez considérablement simplifier vos tâches répétitives. Ainsi, vous pouvez par exemple entretenir vos bases de données ou un code source étendu. Plutôt que de modifier manuellement 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 fonctionne à 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éliorées par des options.

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

Vous pouvez choisir de les saisir directement dans la commande ou de les lire à partir d’un fichier. Si vous choisissez 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 possibilité de définir des paramètres en utilisant la commande SED. Ces paramètres sont particulièrement importants pour la commande SED, car ils sont les seuls à pouvoir vous indiquer la manière dont vous devez interpréter la commande suivante. Les options suivantes sont à votre disposition :

Option

Explication

-e

Indique l’utilisation 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 temporaire 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éparément plutôt que considérés comme un long flux de données.

-r

Indique que la commande accepte les expressions régulières étendues.

Les options -e et -f sont les plus importantes. Elles vous indiquent si la commande se trouve directement dans la commande SED (il s’agit alors d’un script SED) ou si celle-ci doit recourir à un fichier supplémentaire. 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 directement 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 extrêmement importante, l’option -n est probablement essentielle à 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 particulièrement utile pour les bases de données volumineuses. Si vous décidez d’activer l’option, seules les lignes concernées par la commande s’affichent.

Commandes

Les commandes vous permettent 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écifiées.

Commande

Description

a

append : ajoute une ou plusieurs autres lignes aux lignes déjà sélectionnées.

c

change : modifie les lignes sélectionnées à l’aide de nouveaux contenus.

d

delete : supprime les lignes sélectionnées.

g

get : copie le contenu de l’espace de stockage dans l’espace de travail.

G

GetNewline : 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

HoldNewLine : ajoute le contenu de l’espace de travail à l’espace de stockage.

i

insert : insère une ou plusieurs lignes avant les lignes sélectionnées.

l

listing : affiche l’ensemble des caractères non imprimables.

n

next : passe à la commande suivante sur une nouvelle ligne de commande.

p

print : affiche les lignes sélectionnées.

q

quit : quitte la commande SED de Linux.

r

read : lit toutes les lignes sélectionnées d’un fichier.

s

substitute : remplace une chaîne de caractères spécifiée par une autre.

x

xchange : intervertit 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 correspondant pas à la saisie.

Remarque

L’espace de stockage et l’espace de travail ont tous deux des tâches différentes : l’espace de travail correspond à une mémoire vive à court terme. Il contient les données avec lesquelles la commande fonctionne à 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 différentes options :

Option

Description

=

Indique le numéro de ligne des lignes sélectionnées.

p

Affiche les lignes modifiées.

g

Applique la commande à l’intégralité du fichier.

Remarque

Vos commandes doivent toujours être entourées par des guillemets simples. Cela vous permet d’éviter à la saisie d’être réinterprétée. Ces caractères ne sont en principe pas nécessaires, mais ils éliminent toutefois nombre de sources d’erreur.

Expressions régulières

Pour utiliser la commande SED, il est essentiel de comprendre les expressions régulières. Ces caractères servent à indiquer à votre commande la manière dont elle doit traiter une séquence de caractères. Les crochets et les parenthèses sont par exemple particulièrement importants à cet effet.

  • [ABC] : une classe de caractères peut être utilisée pour rechercher une correspondance à partir d’un groupe de lettres, de chiffres ou de symboles ; soit A, soit B, soit C.
  • (ABC) : Un groupe de caractères correspond à un terme fixe, ici « ABC » (dans cet ordre).

Dans le cas des expressions régulières, les caractères génériques permettent aussi de rechercher uniquement certaines parties d’un terme. Deux variantes différentes sont à votre disposition.

  • . : le point peut remplacer exactement un caractère.
  • * : l’astérisque peut remplacer n’importe quel nombre de caractères.

En outre, les expressions régulières vous donnent la possibilité de déterminer plus précisément la fréquence des (combinaisons de) caractères.

  • ? : le point d’interrogation indique qu’un terme peut tout aussi bien apparaître une fois que pas du tout.
  • + : le signe « plus » indique que le caractère concerné peut apparaître plusieurs fois (mais au minimum une fois).
  • {0,n} : mettre un nombre entre accolades revient à spécifier exactement la fréquence à laquelle une combinaison de caractères peut apparaître. En saisissant deux valeurs séparées par une virgule, vous déterminez le minimum et le maximum de répétitions possibles.

Enfin, lorsque vous utilisez la commande SED sous Linux, vous pouvez aussi ajouter des caractè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 représente une alternative entre les deux.
  • ^ : l’accent circonflexe placé directement avant un terme permet d’ignorer ce dernier ; cette chaîne de caractères ne doit donc pas apparaître.

Vous pouvez utiliser ces caractè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 considérée comme la cible de votre commande. Vous disposez de différentes possibilités pour spécifier celle-ci. Dans bon nombre de situations, vous pouvez introduire des requêtes améliorées à l’aide d’expressions régulières. Mais, par exemple, vous pouvez aussi sélectionner des lignes directement dans le fichier texte. Il vous suffit ensuite de renseigner les différentes adresses en conséquence.

Le premier exemple se rapporte donc à des lignes spécifiques :

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

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

Si vous n’êtes pas en mesure d’identifier précisément les lignes qui contiennent les informations avec lesquelles vous voulez travailler, vous pouvez effectuer une recherche à partir de l’adresse. Il est essentiel que vos expressions soient toujours entourées par des barres obliques. Celles-ci vous permettent de séparer le véritable terme de recherche réel d’autres informations, comme les commandes.

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

Ce code vous indique toutes les lignes considé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 rapidement vous aider dans un grand nombre de situations. Cet outil prend réellement tout son sens lorsque vous devez, en une fois, apporter de nombreuses modifications à des fichiers texte volumineux. Les trois exemples suivants décrivent différentes manières d’intégrer la commande SED de Linux à votre utilisation quotidienne.

Recherche d’un fichier texte

Le plus simple des cas d’utilisation consiste à rechercher des données spécifiques au sein d’un document. Celui-ci peut par exemple s’avérer intéressant dans des bases de données étendues ou dans du code source. Il vous permet de trouver rapidement trouver un passage, que vous souhaitiez simplement le lire ou également le modifier.

Essayez à présent d’imaginer que vous recherchez une bouteille de Chardonnay dans votre grande cave à vin et que vous souhaitez, en outre, afficher la première ligne de la base de données expliquant la répartition en colonnes de celle-ci. Voici la commande pouvant vous aider à trouver la position de vos bouteilles :

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 introduites 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 uniquement afficher les bouteilles datant des années 1980, il vous suffit de modifier légèrement 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’exactitude de ces informations.

Ajout d’informations

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écessaire d’ouvrir, de modifier et d’enregistrer votre fichier à l’aide un éditeur de texte complet. À la place, il vous suffit d’une seule ligne de code pour apporter une modification.

Toujours selon cet exemple, imaginez que vous recevez deux bouteilles de vin à ajouter à votre collection. 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’expression 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 directement 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 manuellement la structure d’une grande base de données contenant énormément d’entrées. La commande SED de Linux vous offre une solution rapide à cet effet. Jusqu’à maintenant, les diffé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’application de la commande à l’intégralité du fichier.

L’insertion d’informations supplémentaires 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 collection, commencez par indiquer que tous les vins ont déjà été testés.

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

Cet indicateur 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 remplacement au niveau de la première ligne.

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

Alternatives à 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éalisation de certaines d’entre elles peut s’avérer très fastidieuse et nécessiter de mettre en place quelques astuces. Par ailleurs, il est envisageable de parvenir aux mêmes résultats avec des commandes similaires, le tout plus rapidement et en toute sécurité.

AWK

L’outil AWK est présenté comme étant une amélioration de la commande SED. Cette commande vous permet elle aussi d’utiliser des expressions régulières, mais offre également des options supplémentaires prises en charge par des langages de programmation plus complexes. Avec la commande AWK, vous pouvez aussi compiler des commandes comportant des instructions « if… else » ou des boucles « do… while ».

PERL

Si l’outil AWK est avant tout axé sur le langage C, une autre commande fonctionne 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éalisation de tâches moins importantes au sein du terminal ou des scripts bash.

TR

Pour transformer les caractères individuels 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 caractères spéciaux. Cette commande vous permet par exemple de supprimer rapidement tout double espace ou de modifier les majuscules / minuscules. Ces petites tâches sont très faciles à accomplir en utilisant la commande TR, mais les tâches plus complexes requièrent l’utilisation de solutions telles que la commande SED.