Sed Linux : la commande pour rechercher et remplacer du texte

Développeur utilisant la commande sed sous Linux pour modifier du texte dans un terminal

sed est un éditeur de flux Linux qui permet de rechercher, remplacer, afficher ou supprimer du texte dans un fichier ou dans un pipeline, sans jamais ouvrir l’éditeur manuellement. Un exemple suffit à comprendre son principe : la commande sed 's/chat/chien/' animaux.txt remplace le premier mot « chat » de chaque ligne par « chien » et affiche le résultat à l’écran, sans toucher au fichier original.

Comment fonctionne sed sous Linux

sed traite le texte ligne par ligne. Il lit chaque ligne d’entrée, applique les instructions demandées, puis envoie le résultat vers la sortie standard. La commande peut recevoir son texte de trois façons différentes : depuis un fichier passé en argument, depuis l’entrée standard, ou depuis un pipeline relié à une autre commande. Par exemple, cat fichier.txt | sed 's/oui/non/' fonctionne exactement comme sed 's/oui/non/' fichier.txt.

La syntaxe générale suit ce modèle : sed [options] 'script' fichier. Le script contient une ou plusieurs instructions, comme s pour substituer ou d pour supprimer. Les options -e permettent d’enchaîner plusieurs scripts dans une même commande, tandis que -f charge une suite d’instructions depuis un fichier externe, ce qui est utile pour les traitements répétitifs.

Ce fonctionnement ligne par ligne rend sed particulièrement adapté aux traitements dans un pipeline, en complément d’autres commandes Linux. Il est courant de le voir combiné avec cat, find ou ssh pour transformer un flux de texte à la volée, sans créer de fichier intermédiaire. Cette logique de flux, plutôt que de document ouvert en mémoire, explique aussi pourquoi sed reste rapide même sur des fichiers volumineux : il n’a pas besoin de charger l’intégralité du contenu avant de commencer le traitement.

Remplacer du texte avec la commande s

La commande s/motif/remplacement/ constitue l’usage central de sed. Elle recherche une expression régulière et remplace la portion de texte correspondante par la valeur indiquée. Par exemple :

sed 's/Paris/Lyon/' villes.txt

Cette commande remplace la première occurrence de « Paris » sur chaque ligne. Si une ligne contient plusieurs fois le mot recherché, seule la première apparition est modifiée par défaut.

Pour remplacer toutes les occurrences présentes sur une même ligne, il faut ajouter le drapeau g à la fin de l’expression :

sed 's/Paris/Lyon/g' villes.txt

Ce drapeau g (pour « global ») est indispensable dès qu’un mot apparaît plusieurs fois sur une ligne et que toutes les occurrences doivent être corrigées, par exemple lors d’un nettoyage de fichier de configuration.

Lire aussi :  Team Linux : utiliser Microsoft Teams sur Ubuntu, Debian et Fedora

Modifier directement un fichier avec -i

Par défaut, sed affiche uniquement le résultat dans le terminal et ne modifie jamais le fichier original. Pour appliquer les changements directement, GNU sed propose l’option -i :

sed -i 's/ancien/nouveau/g' fichier.txt

Cette commande écrase le fichier avec le texte modifié. Avant de l’utiliser, il est recommandé de prévisualiser le résultat avec la commande sans -i, puis de créer une sauvegarde. GNU sed permet de générer automatiquement une copie de l’original en ajoutant une extension après -i :

sed -i.bak 's/ancien/nouveau/g' fichier.txt

Cette variante crée un fichier fichier.txt.bak contenant le contenu d’origine avant toute modification, ce qui évite de perdre des données en cas d’erreur dans l’expression régulière.

Afficher ou supprimer des lignes ciblées

sed permet de sélectionner des lignes précises grâce à leur numéro, une plage ou un motif. L’option -n désactive l’affichage automatique de chaque ligne, et la commande p imprime uniquement les lignes choisies :

sed -n '10,20p' fichier.txt

Cette commande affiche uniquement les lignes 10 à 20 du fichier. Elle est pratique pour extraire un passage précis d’un journal système ou d’un fichier volumineux sans l’ouvrir entièrement.

La suppression de lignes fonctionne sur le même principe avec la commande d :

sed '5d' fichier.txt

Cette instruction exclut la cinquième ligne du résultat affiché. Une plage est également possible, par exemple sed '5,10d' fichier.txt supprime les lignes 5 à 10. Un motif peut aussi remplacer un numéro de ligne, comme dans sed '/erreur/d' fichier.txt, qui retire toutes les lignes contenant le mot « erreur ».

Filtrer par motif et combiner les instructions

sed accepte des motifs à la place des numéros de ligne pour cibler une zone précise du texte. La syntaxe /motif1/,/motif2/ sélectionne toutes les lignes situées entre la première ligne correspondant à motif1 et la première ligne correspondant à motif2 :

sed -n '/début/,/fin/p' fichier.txt

Cette commande affiche uniquement le bloc de texte compris entre les deux repères. Plusieurs instructions peuvent être combinées avec l’option -e, par exemple sed -e 's/a/b/' -e '3d' fichier.txt applique une substitution puis supprime la troisième ligne dans la même exécution.

Expressions régulières, groupes et guillemets

sed s’appuie sur les expressions régulières pour repérer les motifs à traiter. Les caractères spéciaux comme ., *, ^ ou $ gardent leur signification habituelle : le point représente un caractère quelconque, l’astérisque répète l’élément précédent, et les accents circonflexe et dollar ciblent respectivement le début et la fin de ligne.

Les parenthèses échappées permettent de créer des groupes réutilisables dans le remplacement grâce aux références arrière, notées \1, \2, etc. :

sed 's/\(Jean\) \(Dupont\)/\2 \1/' contact.txt

Cette commande inverse un prénom et un nom en s’appuyant sur les deux groupes capturés. Avec GNU sed, l’option -E autorise une syntaxe étendue où les parenthèses n’ont plus besoin d’être échappées, ce qui rend les expressions plus lisibles.

Lire aussi :  Comparaison de deux documents Word : la méthode complète pour repérer toutes les différences

Le choix des guillemets a aussi son importance : les guillemets simples empêchent le shell d’interpréter le contenu du script, tandis que les guillemets doubles autorisent le remplacement de variables. Lorsque le texte recherché contient lui-même des slashs, comme un chemin de fichier, il est possible de changer le séparateur de la commande s pour éviter les erreurs de syntaxe :

sed 's#/usr/local#/opt#' chemin.txt

Remplacer le / habituel par # évite d’avoir à échapper chaque slash présent dans le motif. D’autres caractères comme | ou : fonctionnent tout aussi bien comme séparateur, à condition de rester cohérent sur les trois occurrences de la commande s.

Les erreurs les plus fréquentes avec sed viennent justement d’un mauvais échappement des caractères spéciaux. Un slash oublié dans le motif, une parenthèse non échappée en syntaxe classique, ou des guillemets doubles utilisés par erreur avec une variable shell non définie peuvent provoquer un message d’erreur ou, pire, une substitution silencieuse mais incorrecte. Tester la commande sur un extrait de texte avant de l’appliquer à un fichier complet reste le moyen le plus sûr d’éviter ce type de désagrément.

Tableau récapitulatif des commandes essentielles

BesoinCommandeRésultatPrécaution
Remplacer un motsed 's/a/b/' fichierPremière occurrence par ligneVérifier avant -i
Remplacer partoutsed 's/a/b/g' fichierToutes les occurrences par ligneTester sur une copie
Modifier le fichiersed -i.bak 's/a/b/g' fichierFichier écrasé, sauvegarde crééeGarder le .bak
Supprimer une lignesed '5d' fichierLigne 5 exclue de l’affichageNe modifie pas le fichier sans -i

Différences entre GNU sed, POSIX et BSD

Les commandes présentées ici correspondent à GNU sed, installée par défaut sur la plupart des distributions Linux. Les systèmes BSD, dont macOS, utilisent une version plus proche du standard POSIX, où certaines options se comportent différemment. L’exemple le plus connu concerne l’option -i : sous GNU sed, -i peut s’utiliser seule, alors que BSD sed exige systématiquement une extension de sauvegarde après -i, même vide (-i ''). Ce détail explique pourquoi un script fonctionnant sous Linux peut échouer tel quel sur macOS.

Sed face à grep et awk

sed, grep et awk sont souvent utilisés ensemble dans un pipeline, mais chacun a un rôle distinct. grep sert principalement à rechercher et afficher les lignes correspondant à un motif, sans les modifier. sed va plus loin en transformant le texte trouvé, que ce soit pour remplacer, supprimer ou réorganiser des lignes. awk, de son côté, traite le texte colonne par colonne et convient mieux aux calculs ou à l’extraction de champs précis dans un fichier structuré. Pour une simple recherche, grep suffit ; pour une modification de contenu, sed reste l’outil le plus direct.

Bonnes pratiques avant toute modification avec sed

Avant d’appliquer une commande sed avec -i sur un fichier important, il est conseillé de lancer d’abord la commande sans cette option pour observer le résultat dans le terminal. Une fois le résultat validé, la sauvegarde automatique via -i.bak protège contre une erreur de syntaxe ou un motif trop large. Sur un fichier de configuration système ou un script critique, ce réflexe évite de devoir restaurer une version antérieure depuis une sauvegarde externe.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *