Introduction
Une tâche courante de traitement de texte consiste à « rechercher et remplacer ». Dans les traitements de texte, cette opération est interactive. Dans les environnements Linux en ligne de commande, sed applique le même principe de manière scriptable et non interactive.
sed est un éditeur de texte non interactif qui traite le texte ligne par ligne. Il est particulièrement efficace pour les opérations de substitution, lorsque vous devez remplacer certains motifs par un nouveau texte. Cette approche est utile pour l’automatisation, car personne n’a besoin de rester devant un éditeur pour effectuer plusieurs fois la même modification.
Dans ce laboratoire, vous apprendrez à :
- Substituer du texte (
s) : effectuer des opérations simples de recherche et de remplacement. - Effectuer un remplacement global (
g) : remplacer toutes les occurrences d’un motif dans une ligne, et pas seulement la première. - Utiliser des délimiteurs personnalisés : traiter du texte contenant des barres obliques, comme les chemins de fichiers, avec d’autres délimiteurs.
- Modifier un fichier sur place avec une sauvegarde : modifier des fichiers en toute sécurité en créant automatiquement des copies de sauvegarde.
Substitution simple
Commençons par effectuer une substitution simple sur une chaîne. Nous allons remplacer le mot « World » par « Linux ».
La commande de substitution de sed est s.
Sa syntaxe est s/Pattern/Replacement/.
Cette forme de commande est si courante que beaucoup d’utilisateurs considèrent sed comme un « outil de recherche et de remplacement ». Il s’agit en réalité d’un éditeur de flux. La substitution est simplement l’une de ses commandes de modification les plus utilisées.
Exécutez cette commande pour voir son fonctionnement :
echo "Hello World" | sed 's/World/Linux/'
Fonctionnement :
echoenvoie « Hello World » vers la sortie standard.- Le tube
|transmet cette sortie àsed. sedlit le texte, recherche le motif « World », le remplace par « Linux », puis affiche le résultat.
Remarque : cette commande ne modifie pas définitivement la source d’origine ; elle affiche simplement le texte modifié à l’écran, sur la sortie standard.
Cette distinction est essentielle pour modifier des fichiers en toute sécurité depuis la ligne de commande. Dans l’environnement Unix, les outils affichent souvent d’abord un flux transformé ; vous choisissez ensuite si vous souhaitez enregistrer ou rediriger le résultat.
Remplacement global
Par défaut, sed ne remplace que la première correspondance trouvée sur chaque ligne.
Si le texte est « apple apple » et que vous remplacez « apple » par « orange », sed affiche « orange apple ».
Pour remplacer toutes les occurrences d’une ligne, vous devez utiliser l’indicateur global (g) à la fin de la commande de substitution.
Le point important est « sur chaque ligne ». sed traite une ligne à la fois. L’indicateur g agit donc sur toutes les correspondances de la ligne en cours, et non sur l’ensemble du fichier considéré comme un seul grand bloc de texte.
Vérifions le contenu de notre fichier d’exemple quote.txt :
cat quote.txt
Sortie : I love Coding. Coding is fun.
Essayez maintenant de remplacer « Coding » par « Programming » sans utiliser l’indicateur global :
sed 's/Coding/Programming/' quote.txt
Résultat : I love Programming. Coding is fun.
Notez que la deuxième occurrence de « Coding » n’a pas été remplacée.
Ajoutez maintenant l’indicateur g :
sed 's/Coding/Programming/g' quote.txt
Résultat : I love Programming. Programming is fun.
Les deux occurrences ont maintenant été remplacées correctement.
Utiliser des délimiteurs différents
La syntaxe standard de sed utilise des barres obliques / comme délimiteurs : s/old/new/.
Cependant, si le texte à remplacer contient des barres obliques, comme un chemin de fichier (/usr/local/bin), vous devez échapper chaque barre oblique avec une barre oblique inversée. La commande devient alors difficile à lire : s/\/usr\/local\/bin/\/bin/.
Heureusement, sed vous permet d’utiliser presque n’importe quel caractère comme délimiteur. Les alternatives courantes sont #, : et |.
Choisir un délimiteur lisible est une compétence pratique, et pas seulement une astuce de syntaxe. Lorsque les motifs contiennent de nombreux caractères /, modifier le délimiteur rend la commande plus facile à comprendre et réduit les risques d’erreur.
Créez un fichier contenant un chemin :
echo "/usr/local/bin" > path.txt
Remplacez maintenant /usr/local/bin par /bin en utilisant # comme séparateur :
sed 's#/usr/local/bin#/bin#' path.txt
Résultat : /bin
Comme nous avons utilisé # comme délimiteur, sed a traité les caractères / du chemin comme du texte normal. La commande est ainsi plus claire et plus facile à lire.
Modification sur place avec sauvegarde
Jusqu’à présent, sed a uniquement affiché les modifications à l’écran. Pour modifier directement le fichier, c’est-à-dire « sur place », nous utilisons l’option -i.
Cependant, modifier directement des fichiers peut être risqué. Si vous vous trompez dans votre motif, vous risquez de perdre des données. Dans l’idéal, vous devez créer une sauvegarde du fichier d’origine avant de le modifier.
Pour cela, indiquez une extension avec l’option -i, par exemple -i.bak.
Modifions quote.txt et créons automatiquement une sauvegarde nommée quote.txt.bak.
sed -i.bak 's/fun/awesome/' quote.txt
Vérifiez maintenant le contenu du fichier modifié :
cat quote.txt
Résultat : I love Coding. Coding is awesome.
Vérifiez ensuite que la sauvegarde existe et qu’elle contient le texte d’origine :
ls -l quote.txt.bak
cat quote.txt.bak
Résultat : I love Coding. Coding is fun.
Cette méthode est recommandée lorsque vous appliquez des modifications automatisées à plusieurs fichiers.
Cette habitude de créer une sauvegarde est importante, car les modifications non interactives sont rapides, mais ne pardonnent pas les erreurs. Lorsque vous automatisez des remplacements de texte dans plusieurs fichiers, une petite erreur dans un motif peut se propager rapidement. Conserver une copie originale constitue donc une mesure de sécurité simple.
Résumé
Dans ce laboratoire, vous avez appris les notions essentielles de la substitution de texte avec sed :
- Substitution (
s///) : la commande standard pour rechercher et remplacer du texte. - Indicateur global (
g) : remplacer toutes les occurrences d’un motif sur une ligne. - Délimiteurs personnalisés : utiliser des caractères comme
#pour traiter en toute sécurité les chemins et les URL contenant/. - Sauvegarde lors d’une modification sur place (
-i.bak) : modifier des fichiers en toute sécurité tout en conservant leur contenu d’origine.
Ces compétences vous permettent d’automatiser efficacement et en toute sécurité des tâches complexes de traitement de texte.



