Skip to content

sed : Le Scalpel Du DevOps

🎯 Objectifs de ce cours

À la fin, tu seras capable de :

Remplacer du texte : Changer http:// en https://, updater des configs en masse
Supprimer des lignes : Nettoyer les fichiers (commentaires, lignes vides)
Modifier directement : Appliquer les changements sans ouvrir l'éditeur
Automatiser des tâches : Des remplacements complexes en une ligne
Traiter des fichiers énormes : Quand vim/nano ne suffisent pas
Utiliser les regex : Pour des patterns précis et puissants


❌ Le Problème : 500 Fichiers À Configurer

Imagine ça :

⚠️ Urgent : Changer tous les passwords en dur dans les configs
   → 500 fichiers à éditer
   → Si tu ouvres chaque fichier dans un éditeur = 2 heures
   → Tu vas faire des erreurs
   → C'est répétitif et ennuyeux

Avec sed ?

sed -i 's/password_old/password_new/g' *.conf
# 1 seconde. Fini.

Voilà pourquoi sed est TON OUTIL.

❌ Avant (Sans sed) ✅ Après (Avec sed)
Ouvrir chaque fichier manuellement Une seule commande
Chercher + remplacer + sauvegarder Automatique
Risque d'oublis Traité en masse
2 heures de travail 2 secondes

sed n'est pas juste un outil. C'est ton superpouvoir pour automatiser.


🧱 Comment sed Pense (C'est Logique !)

sed fonctionne simplement :

  1. Lis la ligne du fichier
  2. Exécute la commande dessus
  3. Affiche le résultat (ou modifie directement)
  4. Répète pour toutes les lignes
Fichier
  ↓
[Ligne 1] → sed 's/foo/bar/' → [Ligne 1 modifiée]
[Ligne 2] → sed 's/foo/bar/' → [Ligne 2 modifiée]
[Ligne 3] → sed 's/foo/bar/' → [Ligne 3 modifiée]
  ↓
Résultat

C'est ça, sed. Rien de magique, c'est juste un robot qui applique une action à chaque ligne.


📝 La Syntaxe : Format Universel

Structure générale :

sed 'instruction' fichier.txt

Décomposons un exemple concret :

sed 's/search/replace/g' config.txt
│    │ │      │       │  │
│    │ │      │       │  └─ Fichier à traiter
│    │ │      │       └─ Drapeau : g = remplacer TOUTES les occurrences
│    │ │      └─ Délimiteur (/) + Remplacement + Délimiteur (/)
│    │ └─ Délimiteur (/) + Motif à chercher + Délimiteur (/)
│    └─ Commande : s = Substitute (remplacer)
└─ L'outil sed

À l'intérieur des guillemets 's/search/replace/g' :
- s = substitution (remplacer)
- / = délimiteur (sépare les 3 parties)
- search = ce qu'on cherche
- replace = ce qu'on met à la place
- g = drapeau global (toutes les occurrences)

C'est tout ce qu'il y a à savoir !


🔍 Les Commandes de Base

s : Substitute (Remplacer)

sed 's/vieux/nouveau/' fichier.txt

Résultat :
- Cherche vieux
- Remplace par nouveau
- ATTENTION : Remplace UNE FOIS par ligne seulement

Pour remplacer TOUTES les occurrences :

sed 's/vieux/nouveau/g' fichier.txt

Le g = "global" = remplace partout sur la ligne.

Exemple DevOps réel :

# Changer le host dans nginx.conf
sed 's/localhost/192.168.1.100/g' /etc/nginx/nginx.conf

# Changer http en https partout
sed 's/http:/https:/g' config.yml

d : Delete (Supprimer)

sed '/motif/d' fichier.txt

Supprime les lignes qui contiennent motif.

Exemples :

# Supprimer les lignes vides
sed '/^$/d' script.sh

# Supprimer les commentaires (#)
sed '/^[[:space:]]*#/d' config.yaml

# Supprimer une plage de lignes (5 à 10)
sed '5,10d' fichier.txt

Utilité DevOps :

# Nettoyer les logs de tous les WARNINGS
sed '/WARNING/d' /var/log/app.log

# Supprimer les lignes vides d'une config
sed '/^$/d' /etc/app/config.conf

a : Append (Ajouter Après)

sed '/motif/a\nouveau texte' fichier.txt

Ajoute une ligne juste APRÈS la ligne qui contient motif.

Exemple :

# Ajouter une ligne de header après la première ligne
sed '1a\# Configuration generated by deploy' config.conf

# Ajouter une remarque après une ligne contenant "database"
sed '/database/a\# NOTE: Keep in sync with dev server' settings.conf

i : Insert (Ajouter Avant)

sed '/motif/i\nouveau texte' fichier.txt

Ajoute une ligne juste AVANT la ligne qui contient motif.

c : Change (Remplacer Toute La Ligne)

sed '3c\Ceci est la nouvelle ligne 3' fichier.txt

Remplace TOUTE la ligne 3 par le texte spécifié.


🎯 Patterns & Regex : Chercher Précisément

Parfois, tu ne veux pas juste "vieux" → "nouveau". Tu veux être PRÉCIS.

Motifs Simples

# Début de ligne
^motif          # Cherche "motif" au début
sed 's/^/# /' config.conf   # Ajoute # au début (commenter toutes les lignes)

# Fin de ligne
motif$          # Cherche "motif" à la fin
sed 's/$/ (production)/' app.conf   # Ajoute du texte à la fin

# N'importe quel caractère
.               # Point = 1 caractère quelconque
sed 's/a.c/XYZ/' fichier.txt   # Remplace "aXc" par "XYZ"

# Zéro ou plusieurs répétitions
*               # Répète l'élément précédent
sed 's/a*/BB/' fichier.txt   # Remplace les "a" par "BB"

Classes de Caractères

# Chiffres
[0-9]           # Un chiffre
[[:digit:]]     # Même chose (plus lisible)

# Lettres minuscules
[a-z]           # Minuscule
[[:lower:]]     # Minuscule

# Lettres majuscules
[A-Z]           # Majuscule
[[:upper:]]     # Majuscule

# Espaces
[[:space:]]     # Espace ou tabulation

Exemples Concrets DevOps

# Changer les adresses IP (192.168.1.X)
sed 's/192\.168\.1\.[0-9]\+/10.0.0.1/g' config.txt

# Convertir des logs en majuscules
sed 's/error/ERROR/g' app.log

# Nettoyer les espaces en fin de ligne
sed 's/[[:space:]]*$//' config.conf

🔧 Le Trick Ultime : -i (In-Place Edit)

Par défaut, sed affiche le résultat. Il ne modifie PAS le fichier.

sed 's/foo/bar/' config.txt
# Affiche le résultat à l'écran
# config.txt n'est pas modifié

Pour VRAIMENT modifier le fichier :

sed -i 's/foo/bar/g' config.txt
# config.txt est modifié directement

⚠️ ATTENTION : -i est dangereux ! Si tu fais une erreur, le fichier est cassé.

Solution : Fais une sauvegarde d'abord

sed -i.bak 's/foo/bar/g' config.txt
# Crée config.txt.bak (copie de sécurité)
# Modifie config.txt

Exemple DevOps réel :

# Sécuriser : faire backup + modifier
sed -i.bak 's/http:/https:/g' nginx.conf
# nginx.conf.bak = copie original
# nginx.conf = version modifiée

# Si ça casse, tu reviens en arrière
mv nginx.conf.bak nginx.conf

📚 Cas D'Usage DevOps Réels

1️⃣ Nettoyer Une Configuration

# Supprimer commentaires + lignes vides
sed -e '/^[[:space:]]*#/d' -e '/^$/d' app.conf

# Résultat : fichier clean

2️⃣ Updater Les URLs En Masse

# Passer tous les URLs de staging à production
sed -i 's/staging\.example\.com/prod\.example\.com/g' *.conf

# Tous les fichiers .conf sont à jour

3️⃣ Changer Les Ports

# Changer le port 8080 en 3000
sed -i 's/:8080/:3000/g' docker-compose.yml

4️⃣ Ajouter Des Headers À Des Fichiers

# Ajouter un copyright au début de tous les scripts
sed -i '1i\#!/bin/bash\n# Copyright 2026 MyCompany' *.sh

5️⃣ Migrer Une Base De Données

# Changer le host de DB dans tous les fichiers
sed -i 's/old-db-server/new-db-server/g' *.sql

🧬 Combiner Plusieurs Commandes

Tu peux chaîner plusieurs actions :

# Nettoyer ET modifier
sed -e '/^#/d' -e 's/foo/bar/g' fichier.txt

# Supprimer les lignes vides, supprimer les commentaires, remplacer `old` par `new`
sed -e '/^$/d' -e '/^#/d' -e 's/old/new/g' config.conf

Avec des pipes :

# Chercher les erreurs puis les compter
grep "ERROR" app.log | sed 's/.*ERROR: //' | sort | uniq -c

⚠️ Les Pièges Courants

❌ Erreur ✅ Solution
sed 's/foo/bar' (pas de /) sed 's/foo/bar/' (ajoute le /)
Oublier les guillemets sed s/foo/bar/g fichier.txt sed 's/foo/bar/g' fichier.txt
Caractères spéciaux non échappés sed 's/a\.b/c/' (échapper le point)
Utiliser / dans le pattern sed 's#old/path#new/path#g' (utilise # au lieu de /)
Modifier un fichier sans backup Toujours : sed -i.bak ...

🧠 Regex Utiles À Connaître

# Début/Fin
^       Début de ligne
$       Fin de ligne

# Jokers
.       Un caractère quelconque
*       Zéro ou plusieurs du précédent
+       Un ou plusieurs du précédent
?       Zéro ou un du précédent

# Ensembles
[abc]   Un de ces caractères (a, b, ou c)
[a-z]   Entre a et z
[^abc]  SAUF a, b, c

# Classes
[[:digit:]]    Chiffre
[[:alpha:]]    Lettre
[[:space:]]    Espace/tab
[[:upper:]]    Majuscule
[[:lower:]]    Minuscule

🧾 Cheat Sheet : Commandes Essentielles

But Commande Exemple
Remplacer 1ère occurrence sed 's/old/new/' sed 's/foo/bar/' file.txt
Remplacer TOUTES sed 's/old/new/g' sed 's/foo/bar/g' file.txt
Supprimer lignes vides sed '/^$/d' sed '/^$/d' config.conf
Supprimer commentaires sed '/^#/d' sed '/^#/d' script.sh
Supprimer plage (5-10) sed '5,10d' sed '5,10d' file.txt
Ajouter après motif sed '/motif/a\texte' sed '/database/a\# PROD DB' config.conf
Remplacer ligne entière sed '2c\nouveau' sed '2c\# Header' file.txt
Modifier le fichier sed -i sed -i 's/foo/bar/g' file.txt
Backup avant modif sed -i.bak sed -i.bak 's/foo/bar/g' file.txt
Supprimer début de ligne sed 's/^/# /' sed 's/^/# /' config.conf (commenter)
Ajouter fin de ligne sed 's/$/ (backup)/' sed 's/$/ (backup)/' file.txt

🎯 Checklist : Tu Maîtrises sed Quand...

  • ✅ Tu peux remplacer du texte dans 10 fichiers en 1 commande
  • ✅ Tu comprends /^$/d pour supprimer les lignes vides
  • ✅ Tu peux nettoyer une config (commentaires + espaces)
  • ✅ Tu utilises -i.bak pour être safe
  • ✅ Tu combines regex + sed sans trop réfléchir
  • ✅ Tu debugges avec des exemples avant -i
  • ✅ Tu sais quand utiliser sed vs grep vs awk

🚀 Tips Pro

1️⃣ Teste AVANT de modifier

# D'abord, regarde le résultat
sed 's/old/new/g' config.txt

# Satisfait ? Alors applique
sed -i 's/old/new/g' config.txt

2️⃣ Utilise des délimiteurs alternatifs

# Problème : des / dans le texte
sed 's/\/path\/to\/file/\/new\/path/g'   # Ugh, illisible

# Solution : utilise #
sed 's#/path/to/file#/new/path#g'        # Beaucoup mieux

3️⃣ Combine avec grep pour être encore plus précis

# Cherche d'abord, puis agis
grep "pattern" file.txt | sed 's/foo/bar/'

4️⃣ Utilise des variables

OLD="http://staging"
NEW="https://prod"
sed -i "s|$OLD|$NEW|g" config.conf

🚀 Prochaines Étapes

Maintenant que tu maîtrises sed :

  • Apprendre awk : Pour des transformations plus complexes
  • Apprendre grep : La recherche avant la modification
  • Créer des scripts bash : Automatiser avec sed
  • Utiliser sed dans la CI/CD : Modifier configs avant déploiement
  • Combiner sed + find : Modifier des centaines de fichiers

sed n'est qu'une brique du DevOps. Mais c'est UNE BRIQUE TRÈS IMPORTANTE. Les autres outils (awk, grep, find) fonctionnent avec sed pour transformer et automatiser. 🏗️

Bienvenue dans le monde de la manipulation de texte. C'est ici que tu deviens vraiment productif ! 💪