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 :
- Lis la ligne du fichier
- Exécute la commande dessus
- Affiche le résultat (ou modifie directement)
- 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
/^$/dpour supprimer les lignes vides - ✅ Tu peux nettoyer une config (commentaires + espaces)
- ✅ Tu utilises
-i.bakpour ê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 ! 💪