Retour au cours

sed

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, sed ne 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 -i d’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 -E pour 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 que sed '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 -i se 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

  1. Correction de faute :

    • Créez un fichier contenant la phrase “Le chateu est sur la coline.”.
    • Utilisez sed pour corriger les deux fautes (“chateu” -> “château”, “coline” -> “colline”) en une seule commande.
  2. Formatage de date :

    • Vous avez un fichier dates.txt avec des dates au format JJ-MM-AAAA.
    • Utilisez sed avec des groupes de capture pour les transformer au format AAAA-MM-JJ.
    • Exemple : 14-07-2025 doit devenir 2025-07-14.
  3. Mise à jour d’un fichier de configuration :

    • Créez un fichier config.ini avec la ligne version = 1.2.3.
    • Écrivez une commande sed -i pour remplacer la version par 1.2.4, en créant un backup.
    • Vérifiez le contenu du fichier modifié et la présence du fichier de backup.