Objectifs
- Effectuer des substitutions de texte simples avec la commande
s. - Remplacer toutes les occurrences sur une ligne avec le flag
g. - Modifier un fichier directement (“in-place”) avec l’option
-i. - Capturer des parties d’un motif pour les réutiliser dans le remplacement.
Explications détaillées
Notions clés
sed : L’éditeur de flux
sed (Stream Editor) est un outil qui parcourt un texte ligne par ligne et applique une ou plusieurs transformations. Son utilisation la plus fréquente est de loin la substitution.
La commande de substitution s
La syntaxe de base est sed 's/motif_a_chercher/chaine_de_remplacement/'.
s: Indique que l’on veut faire une substitution./: C’est le délimiteur. On peut utiliser d’autres caractères (|,#,@) si le motif contient des slashes.- Par défaut,
sedne remplace que la première occurrence trouvée sur chaque ligne.
Les flags de substitution
On peut ajouter des “flags” après le dernier délimiteur pour modifier le comportement.
g(global) : Applique le remplacement à toutes les occurrences de la ligne, pas seulement la première.i(ignore case) : Ignore la différence entre majuscules et minuscules lors de la recherche.
sed 's/ancien/nouveau/gi'
Modification “in-place” avec -i
Par défaut, sed affiche le résultat transformé sur la sortie standard. Pour modifier le fichier d’origine, on utilise l’option -i.
ATTENTION : Cette option est destructive. Il est fortement recommandé de créer une sauvegarde en même temps :
sed -i.bak 's/...' mon_fichier.txt
Cette commande modifie mon_fichier.txt et crée une copie de l’original nommée mon_fichier.txt.bak.
Groupes de capture et références arrières
C’est la fonctionnalité la plus puissante. En utilisant des expressions régulières, on peut “capturer” une partie du texte trouvé pour la réutiliser dans la chaîne de remplacement.
- Avec l’option
-E(regex étendues), on entoure la partie à capturer avec des parenthèses(...). - On peut ensuite y faire référence avec
\1,\2, etc., dans la partie remplacement.
Syntaxe / Usages
# Remplacer la première 'a' par 'A' sur chaque ligne
sed 's/a/A/' fichier.txt
# Remplacer toutes les 'a' par des 'A'
sed 's/a/A/g' fichier.txt
# Modifier le fichier config.yaml directement, avec backup
sed -i.bak 's/port: 80/port: 8080/' config.yaml
# Inverser "prénom nom" en "nom, prénom"
# Ex: "Alice Martin" -> "Martin, Alice"
sed -E 's/([A-Za-z]+) ([A-Za-z]+)/\2, \1/' noms.txt
# La même chose, alimentée par un pipe
echo "Alice Martin" | sed -E 's/([A-Za-z]+) ([A-Za-z]+)/\2, \1/'
Exemples
# Créez un fichier de test 'test.txt'
printf "Ceci est un test.\nUn test est utile.\n" > test.txt
# 1. Remplacement simple
# Ne remplace que le premier "est" de la première ligne
sed 's/est/EST/' test.txt
# 2. Remplacement global
sed 's/est/EST/g' test.txt
# 3. Supprimer les lignes vides (remplacer les lignes contenant uniquement début^ et fin$ par rien)
printf "ligne1\n\nligne3" | sed '/^$/d'
# 4. Commenter une ligne spécifique
# '3s' signifie "appliquer la substitution à la ligne 3 uniquement"
printf "ligne1\nligne2\nligne3" | sed '3s/^/# /'
Bonnes pratiques
- Testez toujours sans
-id’abord. Regardez la sortie dans le terminal pour vous assurer que votre expression fait bien ce que vous attendez avant de modifier le fichier. - Utilisez
sed -Epour activer les expressions régulières étendues. La syntaxe pour les groupes de capture(...)et d’autres opérateurs est plus simple et plus standard. - Changez de délimiteur si votre motif contient des slashes.
sed 's|/vieux/chemin|/nouveau/chemin|'est bien plus lisible quesed 's/\/vieux\/chemin/\/nouveau\/chemin/'.
Pièges courants
- Oublier le flag
g: L’erreur classique qui fait que l’on ne remplace que la première occurrence sur chaque ligne. - Caractères spéciaux : Des caractères comme
.*[$ont une signification spéciale dans les expressions régulières. Il faut les échapper avec un backslash (\.,\*) si vous voulez les traiter littéralement. - Différences entre les versions de
sed: L’option-ise comporte légèrement différemment entre la version GNU (Linux) et celle de BSD (macOS). Sur macOS,-i ''est souvent nécessaire pour une modification sans backup.
Exercices
-
Correction de faute :
- Créez un fichier contenant la phrase “Le chateu est sur la coline.”.
- Utilisez
sedpour corriger les deux fautes (“chateu” -> “château”, “coline” -> “colline”) en une seule commande.
-
Formatage de date :
- Vous avez un fichier
dates.txtavec des dates au formatJJ-MM-AAAA. - Utilisez
sedavec des groupes de capture pour les transformer au formatAAAA-MM-JJ. - Exemple :
14-07-2025doit devenir2025-07-14.
- Vous avez un fichier
-
Mise à jour d’un fichier de configuration :
- Créez un fichier
config.iniavec la ligneversion = 1.2.3. - Écrivez une commande
sed -ipour remplacer la version par1.2.4, en créant un backup. - Vérifiez le contenu du fichier modifié et la présence du fichier de backup.
- Créez un fichier