Quand on doit modifier rapidement le contenu de plusieurs fichiers, effectuer des remplacements massifs ou supprimer certaines lignes en fonction d'un motif, sed est l'outil incontournable. Conçu pour l'édition de flux, sed permet de rechercher, remplacer, supprimer ou insérer du texte directement en ligne de commande, sans ouvrir les fichiers manuellement.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Remplacer du texte avec la commande s/ancien/nouveau/
- Supprimer, insérer et modifier des lignes ciblées
- Utiliser des adresses (numéros de ligne, motifs) pour cibler précisément
- Éditer des fichiers en place avec
-i(en sécurité)
La commande sed dans l'écosystème Linux
Section intitulée « La commande sed dans l'écosystème Linux »sed fait partie des commandes de traitement de texte sous Linux. Chaque outil a sa spécialité :
| Commande | Spécialité | Quand l'utiliser |
|---|---|---|
sed | Éditer du texte en flux | Remplacer, supprimer, insérer du texte |
grep | Rechercher des patterns | Filtrer les lignes matchant un motif |
awk | Traiter des données tabulaires | Extraire/transformer des colonnes |
tr | Translitérer des caractères | Remplacer caractère par caractère |
cut | Extraire des colonnes | Découper par délimiteur ou position |
find | Rechercher des fichiers | Trouver des fichiers par attributs |
Combinaisons fréquentes :
# grep + sed : filtrer puis transformergrep "ERROR" log.txt | sed 's/ERROR/ALERTE/g'
# sed + awk : modifier puis extrairesed 's/;/,/g' data.csv | awk -F',' '{print $2}'
# find + sed : modifier plusieurs fichiersfind . -name "*.conf" -exec sed -i 's/old/new/g' {} +Comprendre la commande sed en 2 min
Section intitulée « Comprendre la commande sed en 2 min »🧠 Modèle mental — Comment fonctionne sed
sed = Lire ligne → Appliquer commandes → Afficher résultat
Points clés
- sed lit le fichier ligne par ligne (flux, pas tout en mémoire)
- Chaque ligne passe par les commandes dans l'ordre
- Par défaut, sed affiche le résultat sur stdout (pas de modification du fichier)
- La commande s/ancien/nouveau/ remplace du texte
- Sans flag g, seule la première occurrence par ligne est remplacée
- Avec -i, sed modifie directement le fichier (danger !)
Règles d'or
Vocabulaire essentiel
- s/old/new/
- Substitution : remplace old par new (1ère occurrence)
- s/old/new/g
- Substitution globale (toutes les occurrences)
- d
- Delete : supprime la ligne
- p
- Print : affiche la ligne
- -i
- In-place : modifie le fichier directement
- -n
- No-print : n'affiche rien sauf avec p
📚 Pour aller plus loin — 12 options avancées
- a\texte
- Append : ajoute après la ligne
- i\texte
- Insert : insère avant la ligne
- c\texte
- Change : remplace toute la ligne
- /regex/
- Adresse : cible les lignes matchant regex
- 1,10
- Plage : lignes 1 à 10
- /début/,/fin/
- Plage entre deux patterns
- -E
- Extended regex (ERE) : +, ?, |, () sans escape
- &
- Dans s///, représente le texte matché
- \1, \2
- Backreferences : groupes capturés
- y/abc/xyz/
- Translitération (comme tr)
- q
- Quit : arrête le traitement
- N
- Next : ajoute la ligne suivante au buffer
sed lit le fichier ligne par ligne (flux), applique les transformations demandées, puis affiche le résultat. Par défaut, le fichier original n'est pas modifié.
Syntaxe minimale
Section intitulée « Syntaxe minimale »sed [OPTIONS] 'COMMANDE' [FICHIER]Les 3 parties d'une commande sed
Section intitulée « Les 3 parties d'une commande sed »La commande sed suit une logique simple :
| Étape | Question | Exemples | Obligatoire ? |
|---|---|---|---|
| Entrée | D'où vient le texte ? | fichier.txt, stdin (pipe) | ⚠️ Un des deux |
| Commande | Quelle transformation ? | s/old/new/g, d, p | ✅ Oui |
| Sortie | Où va le résultat ? | stdout (défaut) ou fichier (-i) | ❌ Non (défaut : stdout) |
La commande de substitution s///
Section intitulée « La commande de substitution s/// »La commande la plus utilisée est s (substitution) :
sed 's/ancien/nouveau/' fichier.txt| Élément | Signification |
|---|---|
s | Commande de substitution |
/ | Délimiteur (peut être #, @, |) |
ancien | Texte ou regex à rechercher |
nouveau | Texte de remplacement |
Par défaut, seule la première occurrence par ligne est remplacée. Pour remplacer toutes les occurrences, ajoutez le flag g :
sed 's/foo/bar/g' fichier.txtLes autres commandes principales
Section intitulée « Les autres commandes principales »| Commande | Effet | Exemple |
|---|---|---|
d | Supprime la ligne | /debug/d |
p | Affiche la ligne | -n '/error/p' |
i\texte | Insère avant la ligne | 1i\# En-tête |
a\texte | Ajoute après la ligne | $a\# Fin |
c\texte | Remplace la ligne entière | 3c\Nouvelle ligne |
q | Quitte après cette ligne | 10q |
Les adresses : cibler des lignes spécifiques
Section intitulée « Les adresses : cibler des lignes spécifiques »Par défaut, sed applique la commande à toutes les lignes. On peut cibler avec des adresses :
| Adresse | Ce qu'elle cible | Exemple |
|---|---|---|
5 | Ligne numéro 5 | sed '5d' f.txt |
$ | Dernière ligne | sed '$d' f.txt |
/pattern/ | Lignes contenant "pattern" | sed '/error/d' f.txt |
1,10 | Lignes 1 à 10 | sed '1,10d' f.txt |
/début/,/fin/ | Plage entre deux patterns | sed '/BEGIN/,/END/d' f.txt |
Les flags de substitution
Section intitulée « Les flags de substitution »| Flag | Effet | Exemple |
|---|---|---|
g | Global (toutes occurrences) | s/a/b/g |
i | Insensible à la casse | s/error/warning/gi |
p | Affiche si substitution faite | -n 's/a/b/p' |
2 | Remplace la 2ème occurrence | s/a/b/2 |
Les délimiteurs alternatifs
Section intitulée « Les délimiteurs alternatifs »Quand le texte contient des /, utilisez un autre délimiteur :
# ❌ Illisible et source d'erreurssed 's/\/var\/log/\/opt\/logs/g' fichier.txt
# ✅ Beaucoup plus clair avec #sed 's#/var/log#/opt/logs#g' fichier.txtL'édition en place avec -i
Section intitulée « L'édition en place avec -i »Par défaut, sed affiche le résultat sur stdout sans modifier le fichier. Pour modifier directement :
# ⚠️ Modifie le fichier (DANGER si erreur)sed -i 's/old/new/g' fichier.txt
# ✅ Crée un backup avant modificationsed -i.bak 's/old/new/g' fichier.txtRègle d'or : toujours tester sans -i d'abord !
# 1. Testersed 's/old/new/g' fichier.txt
# 2. Vérifier le résultat, puis seulement :sed -i.bak 's/old/new/g' fichier.txtErreurs typiques (et solutions)
Section intitulée « Erreurs typiques (et solutions) »| Erreur | Cause | Solution |
|---|---|---|
| Seule la 1ère occurrence est remplacée | Oubli du flag g | Ajouter g : s/old/new/g |
| Erreur de syntaxe avec des chemins | / dans le texte | Utiliser # comme délimiteur |
| Fichier modifié par erreur | -i sans test préalable | Toujours tester sans -i d'abord |
| Rien ne se passe | Pas de match (casse ?) | Vérifier avec grep ou utiliser i (insensible) |
Les modèles de substitution courants
Section intitulée « Les modèles de substitution courants »Maintenant que vous comprenez la logique de sed, voici seize modèles prêts à l'emploi. Chacun donne sa formule générale et un exemple concret.
Substitution simple
Section intitulée « Substitution simple »Remplacer la première occurrence d'un texte sur chaque ligne.
sed 's/ancien/nouveau/' <fichier> # formulesed 's/erreur/warning/' log.txt # exempleancien: texte ou regex à recherchernouveau: texte de remplacement
Substitution globale
Section intitulée « Substitution globale »Remplacer toutes les occurrences sur chaque ligne.
sed 's/ancien/nouveau/g' <fichier> # formulesed 's/foo/bar/g' fichier.txt # exempleg: flag global — toutes les occurrences de la ligne
Substitution insensible à la casse
Section intitulée « Substitution insensible à la casse »Remplacer un texte quelle que soit la casse.
sed 's/ancien/nouveau/gi' <fichier> # formulesed 's/error/warning/gi' log.txt # exemplei: flag insensible à la casse (GNU sed)
Délimiteur alternatif
Section intitulée « Délimiteur alternatif »Éviter les échappements quand le texte contient des /.
sed 's#ancien#nouveau#g' <fichier> # formulesed 's#/var/log#/opt/logs#g' paths.txt # exemple#: délimiteur alternatif (#,@, etc.) à la place de/
Supprimer des lignes par motif
Section intitulée « Supprimer des lignes par motif »Supprimer les lignes contenant un motif.
sed '/motif/d' <fichier> # formulesed '/DEBUG/d' log.txt # exemplemotif: pattern regex à reconnaîtred: commande delete
Supprimer les lignes vides
Section intitulée « Supprimer les lignes vides »Nettoyer un fichier en retirant les lignes vides.
sed '/^$/d' <fichier> # formulesed '/^$/d' texte.txt # exemple^$: regex d'une ligne vide (début = fin)
Cibler par numéro de ligne
Section intitulée « Cibler par numéro de ligne »Appliquer une commande uniquement sur une ligne précise.
sed 'N<commande>' <fichier> # formulesed '5d' fichier.txt # exemple : supprime la ligne 5N: numéro de ligne ciblé
Plage de lignes
Section intitulée « Plage de lignes »Appliquer une commande sur un ensemble de lignes.
sed 'N,M<commande>' <fichier> # formulesed '2,5d' fichier.txt # exemple : supprime les lignes 2 à 5N,M: de la ligne N à la ligne M incluses
Plage entre deux motifs
Section intitulée « Plage entre deux motifs »Cibler les lignes situées entre deux patterns.
sed '/début/,/fin/<commande>' <fichier> # formulesed '/BEGIN/,/END/d' fichier.txt # exemple/début/,/fin/: plage délimitée par deux motifs
Édition en place
Section intitulée « Édition en place »Modifier directement le fichier.
sed -i '<commande>' <fichier> # formulesed -i 's/old/new/g' config.conf # exemple-i: in-place — modifie le fichier. Toujours tester sans-id'abord.
Édition en place avec sauvegarde
Section intitulée « Édition en place avec sauvegarde »Modifier un fichier en conservant une copie de secours.
sed -i.bak '<commande>' <fichier> # formulesed -i.bak 's/old/new/g' config.conf # exemple-i.bak: créefichier.bakavant de modifier
Insérer une ligne
Section intitulée « Insérer une ligne »Ajouter du texte avant une ligne.
sed '<adresse>i\<texte>' <fichier> # formulesed '1i\# En-tête ajouté' fichier.txt # exemplei\: commande insert — ajoute avant la ligne ciblée
Ajouter après une ligne
Section intitulée « Ajouter après une ligne »Ajouter du texte après une ligne.
sed '<adresse>a\<texte>' <fichier> # formulesed '/END/a\# Commentaire' fichier.txt # exemplea\: commande append — ajoute après la ligne ciblée
Afficher uniquement les lignes correspondantes
Section intitulée « Afficher uniquement les lignes correspondantes »Extraire les lignes d'un motif, comme grep.
sed -n '/motif/p' <fichier> # formulesed -n '/ERROR/p' log.txt # exemple-n: désactive l'affichage automatiquep: commande print — affiche la ligne
Références arrière (groupes capturés)
Section intitulée « Références arrière (groupes capturés) »Réutiliser une partie capturée dans le remplacement.
sed 's/\(motif\)/\1 ajout/' <fichier> # formulesed 's/\([0-9]*\)/ID:\1/' fichier.txt # exemple\(\): groupe de capture\1: référence au premier groupe capturé
Réutiliser le texte correspondant (&)
Section intitulée « Réutiliser le texte correspondant (&) »Insérer le texte reconnu dans le remplacement.
sed 's/motif/[&]/g' <fichier> # formulesed 's/[0-9]\+/(&)/g' fichier.txt # exemple&: représente l'intégralité du texte reconnu
Les pièges à éviter
Section intitulée « Les pièges à éviter »Sept erreurs reviennent constamment avec sed. Pour chacune : la commande piégée, le symptôme, la cause et la correction.
Oubli du flag g
Section intitulée « Oubli du flag g »sed 's/foo/bar/' fichier.txt # ❌ ne remplace que la 1ʳᵉ occurrence par ligneSymptôme : certaines occurrences ne sont pas remplacées. Cause : sans g, sed ne touche que la première occurrence de chaque ligne.
sed 's/foo/bar/g' fichier.txt # ✅ flag globalSlash dans le texte à remplacer
Section intitulée « Slash dans le texte à remplacer »sed 's//var/log//opt/logs/' fichier.txt # ❌ erreur de syntaxeSymptôme : erreur unknown command ou résultat inattendu. Cause : les / du texte sont pris pour des délimiteurs.
sed 's#/var/log#/opt/logs#g' fichier.txt # ✅ délimiteur alternatifÉdition -i sans prévisualisation
Section intitulée « Édition -i sans prévisualisation »sed -i 's/important/supprimé/g' fichier.conf # ❌ exécuté sans testSymptôme : données perdues, fichier corrompu. Cause : -i modifie le fichier sans retour arrière possible.
sed 's/old/new/g' fichier # ✅ tester d'abord, puis sed -i.bakMétacaractère regex non échappé
Section intitulée « Métacaractère regex non échappé »sed 's/fichier.txt/fichier.log/' fichier # ❌ le . matche n'importe quel caractèreSymptôme : des correspondances inattendues (fichierXtxt est aussi reconnu). Cause : le point . est un métacaractère regex.
sed 's/fichier\.txt/fichier.log/g' fichier # ✅ point échappéIncompatibilité -i entre GNU et BSD
Section intitulée « Incompatibilité -i entre GNU et BSD »sed -i 's/old/new/' fichier # ❌ échoue sur macOS (BSD sed)Symptôme : erreur invalid command code sur macOS. Cause : BSD sed exige une extension après -i, même vide.
sed -i '' 's/old/new/' fichier # ✅ sur macOS — ou installer GNU sedSaut de ligne dans le remplacement
Section intitulée « Saut de ligne dans le remplacement »sed 's/$/\n/' fichier # ❌ insère un \n littéral, pas un vrai saut de ligneSymptôme : un \n littéral apparaît au lieu d'un retour à la ligne. Cause : la syntaxe \n n'est pas portable dans la partie remplacement.
sed 's/$/\'$'\n''/' fichier # ✅ en bash, via $'\n'Regex gourmande (.* trop large)
Section intitulée « Regex gourmande (.* trop large) »sed 's/<.*>//g' fichier # ❌ supprime du premier < au dernier >Symptôme : <a>texte<b> devient vide au lieu de texte. Cause : .* est gourmand — il reconnaît le maximum possible.
sed 's/<[^>]*>//g' fichier # ✅ classe négative : s'arrête au premier >Travaux pratiques
Section intitulée « Travaux pratiques »Rien ne remplace la pratique. Créez l'environnement de test ci-dessous, puis déroulez les huit étapes. À la fin, nettoyez avec rm -rf ~/sed-lab.
Préparer le terrain
Section intitulée « Préparer le terrain »Ce script crée cinq fichiers de test dans ~/sed-lab : une configuration, un log, un CSV, une liste de chemins et un fichier « brouillon » à nettoyer.
# Créer le labmkdir -p ~/sed-labcd ~/sed-lab
# Fichier de configuration typecat > config.conf << 'EOF'# Configuration serveurserver_host=localhostserver_port=8080debug_mode=truelog_level=INFOdatabase_url=postgres://localhost:5432/mydbmax_connections=100EOF
# Fichier de logscat > access.log << 'EOF'192.168.1.10 - - [15/Jan/2025:10:30:00] "GET /index.html HTTP/1.1" 200 1234192.168.1.20 - - [15/Jan/2025:10:30:05] "POST /api/users HTTP/1.1" 201 567192.168.1.10 - - [15/Jan/2025:10:30:10] "GET /style.css HTTP/1.1" 200 890192.168.1.30 - - [15/Jan/2025:10:30:15] "GET /error HTTP/1.1" 404 123192.168.1.10 - - [15/Jan/2025:10:30:20] "DELETE /api/users/5 HTTP/1.1" 403 45EOF
# Fichier CSVcat > users.csv << 'EOF'id,nom,email,role1,Alice,alice@example.com,admin2,Bob,bob@example.com,user3,Charlie,charlie@example.com,user4,Diana,diana@example.com,moderatorEOF
# Fichier avec cheminscat > paths.txt << 'EOF'/var/log/syslog/home/user/documents/report.pdf/etc/nginx/nginx.conf/usr/local/bin/script.shEOF
# Fichier à nettoyercat > messy.txt << 'EOF' Ligne avec espaces au débutLigne normale Autre ligne avec espacesLigne vide après
Encore du texte Espaces partoutEOF
echo "✅ Lab créé dans ~/sed-lab"ls -la ~/sed-labLes huit étapes
Section intitulée « Les huit étapes »-
Substitution simple. Remplacez
localhostpar127.0.0.1dansconfig.conf.Fenêtre de terminal sed 's/localhost/127.0.0.1/' ~/sed-lab/config.confs/ancien/nouveau/remplace la première occurrence sur chaque ligne. Pour toutes les occurrences : ajoutez le flagg. -
Délimiteur alternatif. Remplacez
/var/logpar/opt/logsdanspaths.txt.Fenêtre de terminal sed 's#/var/log#/opt/logs#' ~/sed-lab/paths.txtQuand le texte contient des
/, on utilise un autre délimiteur (#ici). -
Supprimer des lignes. Supprimez les lignes contenant
404dansaccess.log.Fenêtre de terminal sed '/404/d' ~/sed-lab/access.log/motif/dsupprime les lignes qui contiennent le motif. -
Supprimer les lignes vides. Retirez les lignes vides de
messy.txt.Fenêtre de terminal sed '/^$/d' ~/sed-lab/messy.txt^$reconnaît une ligne vide (début immédiatement suivi de la fin). -
Cibler une ligne par numéro. Remplacez
userparadminuniquement sur la ligne 3 deusers.csv.Fenêtre de terminal sed '3s/user/admin/' ~/sed-lab/users.csvLe numéro placé avant la commande la restreint à cette ligne.
-
Plage de lignes. Remplacez
@example.compar@company.orgsur les lignes 2 à 4 deusers.csv.Fenêtre de terminal sed '2,4s/@example.com/@company.org/' ~/sed-lab/users.csvN,Mcible les lignes de N à M incluses. -
Édition en place avec sauvegarde. Modifiez
config.confen remplaçanttrueparfalse, en gardant une sauvegarde.Fenêtre de terminal sed -i.bak 's/true/false/' ~/sed-lab/config.conf-i.bakmodifie le fichier et créeconfig.conf.bakau préalable. -
Supprimer les espaces en début de ligne. Retirez les espaces au début de chaque ligne de
messy.txt.Fenêtre de terminal sed 's/^[[:space:]]*//' ~/sed-lab/messy.txt^[[:space:]]*reconnaît zéro espace ou plus en début de ligne.
Exercices progressifs
Section intitulée « Exercices progressifs »Huit exercices pour valider votre maîtrise. Tous se traitent sur les fichiers du lab ~/sed-lab. Cherchez d'abord par vous-même, puis dépliez la solution pour vous corriger.
Niveau fondations
Section intitulée « Niveau fondations »Exercice 1 — Substitution basique. Remplacez tous les error par warning dans access.log. Indice : n'oubliez pas le flag g.
Voir la solution
sed 's/error/warning/g' ~/sed-lab/access.logLe flag g remplace toutes les occurrences, pas seulement la première de chaque ligne.
Exercice 2 — Remplacer des chemins. Remplacez /usr/local par /opt dans paths.txt. Indice : les / du texte gênent le délimiteur par défaut.
Voir la solution
sed 's#/usr/local#/opt#g' ~/sed-lab/paths.txtOn utilise # comme délimiteur pour éviter d'échapper les /.
Exercice 3 — Supprimer les commentaires. Supprimez toutes les lignes commençant par # dans config.conf. Indice : ^ représente le début de ligne, d supprime.
Voir la solution
sed '/^#/d' ~/sed-lab/config.conf/^#/ reconnaît les lignes commençant par # ; d les supprime.
Niveau composition
Section intitulée « Niveau composition »Exercice 4 — Nettoyer les espaces. Supprimez les espaces en fin de ligne de messy.txt. Indice : [[:space:]] reconnaît les espaces, $ la fin de ligne.
Voir la solution
sed 's/[[:space:]]*$//' ~/sed-lab/messy.txt[[:space:]]*$ reconnaît zéro espace ou plus juste avant la fin de ligne.
Exercice 5 — Modifier une ligne précise. Changez le contenu entier de la ligne 3 de users.csv en MODIFIÉ. Indice : c\ remplace toute une ligne.
Voir la solution
sed '3c\MODIFIÉ' ~/sed-lab/users.csv3c\ cible la ligne 3 ; c\ remplace son contenu entier.
Exercice 6 — Extraire des lignes (comme grep). Affichez uniquement les lignes d'access.log contenant 404. Indice : -n désactive l'affichage auto, p affiche les lignes reconnues.
Voir la solution
sed -n '/404/p' ~/sed-lab/access.log-n coupe l'affichage par défaut ; /404/p n'affiche que les lignes correspondantes.
Niveau avancé
Section intitulée « Niveau avancé »Exercice 7 — Ajouter un préfixe à chaque ligne. Ajoutez LOG: au début de chaque ligne d'access.log. Indice : ^ reconnaît le début de ligne.
Voir la solution
sed 's/^/LOG: /' ~/sed-lab/access.logs/^/LOG: / remplace le « début de ligne » par LOG: — donc préfixe chaque ligne.
Exercice 8 — Édition en place sécurisée. Remplacez localhost par 127.0.0.1 dans config.conf en conservant une sauvegarde. Indice : -i.bak crée la sauvegarde automatiquement.
Voir la solution
sed -i.bak 's/localhost/127.0.0.1/g' ~/sed-lab/config.conf-i.bak modifie le fichier en place et crée config.conf.bak comme filet de sécurité.
Dépannage
Section intitulée « Dépannage »Quand une substitution sed ne fonctionne pas, le problème vient le plus souvent du motif ou des délimiteurs. Voici comment diagnostiquer.
Méthodes de diagnostic
Section intitulée « Méthodes de diagnostic »# Toujours prévisualiser avant d'utiliser -ised 's/old/new/g' fichier
# Voir quelles lignes sont reconnues par un motifsed -n '/pattern/p' fichier
# Afficher les numéros des lignes reconnuessed -n '/pattern/=' fichier
# Valider le motif isolément avec grepgrep 'pattern' fichierErreurs fréquentes
Section intitulée « Erreurs fréquentes »| Message d'erreur | Cause probable | Solution |
|---|---|---|
unterminated 's' command | Délimiteur de fermeture manquant, ou / non échappé dans le texte | S'assurer d'avoir exactement 3 délimiteurs : s/ancien/nouveau/ |
unknown option -- E | Option non supportée (BSD sed contre GNU sed) | Vérifier sed --version ; sur macOS, installer GNU sed |
no input files | Aucun fichier fourni et aucune entrée standard | Passer un fichier en argument, ou utiliser un pipe |
invalid command code | Commande sed inconnue, ou problème de guillemets | Vérifier la lettre de commande et les guillemets simples |
Aide-mémoire sed
Section intitulée « Aide-mémoire sed »Syntaxe et options
Section intitulée « Syntaxe et options »| Élément | Rôle | Exemple |
|---|---|---|
sed 'cmd' fichier | Applique une commande au fichier | sed 's/a/b/' f.txt |
sed -e 'cmd1' -e 'cmd2' | Enchaîne plusieurs commandes | sed -e 's/a/b/' -e 's/c/d/' |
cmd | sed 'cmd' | Traite l'entrée d'un pipe | cat f.txt | sed 's/a/b/' |
-i | Édition en place (modifie le fichier) | sed -i 's/a/b/' f.txt |
-i.bak | Édition en place avec sauvegarde | sed -i.bak 's/a/b/' f.txt |
-n | Mode silencieux (rien par défaut) | sed -n '/err/p' f.txt |
-E (ou -r) | Active les regex étendues (ERE) | sed -E 's/[0-9]+/X/g' |
-f script.sed | Lit les commandes depuis un fichier | sed -f cmds.sed fichier |
Adresses (ciblage)
Section intitulée « Adresses (ciblage) »| Adresse | Rôle | Exemple |
|---|---|---|
5 | Ligne numéro 5 | 5s/a/b/ |
$ | Dernière ligne | $d |
/regex/ | Lignes reconnues par la regex | /error/d |
1,10 | Lignes 1 à 10 | 1,10s/a/b/ |
/début/,/fin/ | Plage entre deux motifs | /BEGIN/,/END/d |
1~2 | Ligne 1 puis une sur deux (GNU) | 1~2d |
! | Inverse l'adresse (NON) | /DEBUG/!d |
Commandes principales
Section intitulée « Commandes principales »| Commande | Rôle | Exemple |
|---|---|---|
s/old/new/ | Substitue (1ʳᵉ occurrence) | s/error/warning/ |
s/old/new/g | Substitue (toutes les occurrences) | s/foo/bar/g |
s/old/new/gi | Substitue sans tenir compte de la casse | s/error/warning/gi |
d | Supprime la ligne | /^#/d |
p | Affiche la ligne | -n '/error/p' |
q | Quitte après cette ligne | 10q |
= | Affiche le numéro de ligne | /error/= |
i\texte | Insère une ligne avant | 1i\# Header |
a\texte | Ajoute une ligne après | $a\# Footer |
c\texte | Remplace la ligne entière | 3c\Nouvelle ligne |
Regex et références
Section intitulée « Regex et références »| Élément | Rôle | Exemple |
|---|---|---|
& | Le texte reconnu, dans le remplacement | s/[0-9]*/(&)/ |
\1, \2… | Groupes capturés | s/\(.*\)/[\1]/ |
\(\) | Groupe de capture (regex basique) | s/\(mot\)/[\1]/ |
^ / $ | Début / fin de ligne | s/^/PREFIX: / |
. | N'importe quel caractère | s/a.c/X/ |
[abc] / [^abc] | Classe / négation de classe | s/[^0-9]//g |
Délimiteurs alternatifs
Section intitulée « Délimiteurs alternatifs »| Forme | Rôle | Exemple |
|---|---|---|
s#old#new# | Délimiteur # (idéal pour les chemins) | s#/var#/opt#g |
s@old@new@ | Délimiteur @ | s@http://@https://@g |
s|old|new| | Délimiteur | | s|foo|bar|g |
Checklist de maîtrise
Section intitulée « Checklist de maîtrise »Vous maîtrisez sed lorsque vous pouvez cocher chacun de ces points :
- Je sais utiliser
s/ancien/nouveau/pour substituer - Je sais utiliser le flag
gpour remplacer globalement - Je sais utiliser un délimiteur alternatif (
#,@) - Je sais supprimer des lignes avec
d - Je sais cibler des lignes par numéro ou par motif
- Je sais utiliser
-netppour extraire des lignes - Je sais éditer en place avec
-iet-i.bak - Je sais insérer ou ajouter une ligne avec
i\eta\ - Je sais utiliser les références arrière (
\1,&) - Je sais diagnostiquer une substitution qui ne fonctionne pas
Contrôle de connaissances
Section intitulée « Contrôle de connaissances »Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
Informations
- Le chronomètre démarre au clic sur Démarrer
- Questions à choix multiples, vrai/faux et réponses courtes
- Vous pouvez naviguer entre les questions
- Les résultats détaillés sont affichés à la fin
Lance le quiz et démarre le chronomètre
Vérification
(0/0)Profil de compétences
Quoi faire maintenant
Ressources pour progresser
Des indices pour retenter votre chance ?
Nouveau quiz complet avec des questions aléatoires
Retravailler uniquement les questions ratées
Retour à la liste des certifications
Conclusion
Section intitulée « Conclusion »La commande sed est un outil essentiel pour quiconque travaille
régulièrement en ligne de commande. Grâce à sa syntaxe concise et sa capacité à
traiter des flux de texte, elle permet de modifier, nettoyer et transformer
du contenu rapidement et efficacement. Que ce soit pour un remplacement
ponctuel, un nettoyage de logs ou une modification en masse de fichiers de
configuration, la maîtrise de sed fait gagner un temps précieux.
FAQ - Questions Fréquemment Posées
Section intitulée « FAQ - Questions Fréquemment Posées »Principe de fonctionnement
Sed lit le texte ligne par ligne, applique des transformations, et affiche le résultat. Par défaut, le fichier original reste inchangé (sauf-i).Commandes principales
| Commande | Action | Syntaxe | Exemple |
|---|---|---|---|
s |
Substitution | s/ancien/nouveau/ |
sed 's/foo/bar/' file.txt |
d |
Delete (suppression) | [adresse]d |
sed '3d' file.txt |
i |
Insert (avant ligne) | [adresse]i\\texte |
sed '1i\\Header' file.txt |
a |
Append (après ligne) | [adresse]a\\texte |
sed '5a\\Footer' file.txt |
c |
Change (remplacer ligne) | [adresse]c\\texte |
sed '2c\\New' file.txt |
p |
Print (afficher) | [adresse]p |
sed -n '/error/p' file.txt |
sed vs Éditeurs classiques
| Critère | sed | vim/nano | Avantage |
|---|---|---|---|
| Interaction | Non-interactif | Interactif | sed = automatisation |
| Traitement | Flux (stdin/stdout) | Fichier en mémoire | sed = pipelines |
| Volume | Fichiers GB+ | Limité RAM | sed = gros fichiers |
| Automatisation | Scripts shell | Macros limitées | sed = CI/CD |
Cas d'usage quotidiens
# Config : remplacer paramètre
sed 's/DEBUG/INFO/' app.conf
# Logs : supprimer lignes vides
sed '/^$/d' app.log
# CSV : remplacer séparateur
sed 's/;/,/g' data.csv
# Scripts : mettre à jour chemins
sed 's/\/old\/path/\/new\/path/' deploy.sh
# HTML : injection contenu
sed '/<body>/a\\<script src="analytics.js"></script>' index.html
Pourquoi sed est essentiel
Usages principaux
sed permet de transformer du texte automatiquement sans éditeur interactif, directement dans le terminal ou dans des scripts.Scénarios DevOps/SysAdmin
| Contexte | Opération | Commande sed |
|---|---|---|
| Configuration | Changer port dans config | sed 's/port: 8080/port: 9090/' app.yaml |
| Logs | Supprimer lignes vides | sed '/^$/d' app.log |
| Déploiement | Mise à jour chemins | sed 's/\/old\/path/\/new\/path/g' script.sh |
| Data | Convertir CSV | sed 's/;/,/g' export.csv |
| Templating | Injection variables | sed 's/{{VERSION}}/1.2.3/' deploy.yaml |
Exemples concrets
# Mise à jour automatique version dans package.json
sed -i 's/"version": "1.0.0"/"version": "1.1.0"/' package.json
# Nettoyage logs (supprimer DEBUG)
sed '/DEBUG/d' app.log > clean.log
# Modification masse configs Nginx
find /etc/nginx -name '*.conf' -exec sed -i 's/80/8080/' {} \;
# Génération rapport : remplacer placeholder
sed 's/{{DATE}}/2026-01-08/' template.html > report.html
Pourquoi sed plutôt qu'un éditeur ?
Contexte : sed est l'outil de choix pour toute modification répétitive ou scriptée de fichiers texte.Structure générale
sed [OPTIONS] 'COMMANDE' [FICHIER]
Ou avec pipe :commande | sed 'COMMANDE'
Options principales
| Option | Effet | Exemple |
|---|---|---|
-n |
Mode silencieux (pas d'affichage auto) | sed -n '/error/p' log.txt |
-e |
Commande multiple | sed -e 's/foo/bar/' -e 's/baz/qux/' |
-i |
Édition en place (modifie fichier) | sed -i 's/old/new/' file.txt |
-i.bak |
Édition + backup | sed -i.bak 's/old/new/' file.txt |
-f |
Script sed externe | sed -f commands.sed file.txt |
Commandes fondamentales
| Commande | Action | Syntaxe |
|---|---|---|
s |
Substitution | s/ancien/nouveau/[flags] |
d |
Delete (suppression ligne) | [adresse]d |
p |
Print (affichage) | [adresse]p |
i |
Insert (avant ligne) | [adresse]i\\texte |
a |
Append (après ligne) | [adresse]a\\texte |
c |
Change (remplacement ligne) | [adresse]c\\texte |
Exemples de syntaxe
# Substitution simple
sed 's/error/warning/' log.txt
# Plusieurs commandes (-e)
sed -e 's/foo/bar/' -e 's/hello/hi/' file.txt
# Avec adresse (ligne 3)
sed '3d' file.txt
# Avec pattern (lignes contenant "error")
sed '/error/d' log.txt
# Édition en place + backup
sed -i.backup 's/DEBUG/INFO/' config.ini
Structure complète
sed [adresse][commande][options] fichier
# | | |
# | | +-> g (global), i (insensible casse)...
# | +-----------> s, d, p, i, a, c...
# +---------------------> numéro ligne, pattern /.../, plage 1,5
Syntaxe substitution
sed 's/ANCIEN/NOUVEAU/' fichier.txt
Important : Par défaut, remplace seulement la première occurrence par ligne.Exemples basiques
# Remplacer "error" par "warning"
sed 's/error/warning/' app.log
# Remplacer chemin
sed 's/\/usr\/local/\/opt/' config.sh
# Changer extension fichier
sed 's/\.txt/.md/' liste.txt
# Mettre à jour variable
sed 's/PORT=8080/PORT=9090/' .env
Comportement ligne par ligne
# Fichier source
cat exemple.txt
error: failed error
warning: ok
error: timeout
# Substitution (1ère occurrence seulement)
sed 's/error/ERREUR/' exemple.txt
ERREUR: failed error # Seulement 1er "error" remplacé
warning: ok
ERREUR: timeout
Modification en mémoire vs fichier
# Affichage seulement (fichier inchangé)
sed 's/foo/bar/' file.txt
# Redirection vers nouveau fichier
sed 's/foo/bar/' file.txt > output.txt
# Modification directe (avec -i)
sed -i 's/foo/bar/' file.txt
Cas d'usage courants
# CI/CD : mise à jour version
sed 's/v1.0.0/v1.1.0/' README.md
# Logs : masquer IP
sed 's/192\.168\.1\.10/XXX.XXX.X.XX/' access.log
# Config : changer domaine
sed 's/localhost/production.example.com/' app.yaml
Astuce : Pour remplacer toutes les occurrences, utiliser le flag g : sed 's/error/warning/g'.Flag g (global)
sed 's/ANCIEN/NOUVEAU/g' fichier.txt
# |
# +-> g = TOUTES occurrences par ligne
Comparaison sans/avec g
# Fichier test
cat data.txt
foo bar foo baz foo
error error error
# SANS g (1ère occurrence seulement)
sed 's/foo/FOO/' data.txt
FOO bar foo baz foo # Seulement 1er foo
error error error
# AVEC g (toutes occurrences)
sed 's/foo/FOO/g' data.txt
FOO bar FOO baz FOO # Tous les foo
error error error
Cas d'usage pratiques
# CSV : remplacer tous les séparateurs
sed 's/;/,/g' export.csv
# Logs : masquer toutes les IP
sed 's/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/XXX.XXX.X.XX/g' access.log
# HTML : remplacer toutes les occurrences de classe
sed 's/class="old"/class="new"/g' index.html
# Config : mettre à jour tous les ports
sed 's/:8080/:9090/g' services.yaml
Autres flags combinables
| Flag | Effet | Exemple |
|---|---|---|
g |
Global (toutes occurrences) | s/foo/bar/g |
i |
Insensible casse | s/error/warning/gi |
2 |
Seulement 2ème occurrence | s/foo/bar/2 |
p |
Print si modifié (avec -n) | sed -n 's/old/new/gp' |
Exemple combinaison flags
# Remplacer tous "error" (insensible casse) et afficher
sed -n 's/error/WARNING/gip' app.log
# Seulement 2ème occurrence de chaque ligne
sed 's/foo/bar/2' file.txt
Règle : Sans g, sed s'arrête à la 1ère occurrence. Avec g, parcourt toute la ligne.Commande d (delete)
sed 'NUMEROd' fichier.txt
NUMERO = numéro de ligne à supprimer (1 = première ligne).Exemples suppression ligne
# Supprimer ligne 3
sed '3d' file.txt
# Supprimer ligne 1 (en-tête)
sed '1d' data.csv
# Supprimer dernière ligne ($)
sed '$d' file.txt
# Supprimer ligne 5 à 10
sed '5,10d' file.txt
Plages de lignes
| Syntaxe | Effet | Exemple |
|---|---|---|
3d |
Ligne 3 | sed '3d' file.txt |
1d |
Première ligne | sed '1d' file.txt |
$d |
Dernière ligne | sed '$d' file.txt |
2,5d |
Lignes 2 à 5 | sed '2,5d' file.txt |
1,3d |
Lignes 1 à 3 | sed '1,3d' file.txt |
5,$d |
Ligne 5 à la fin | sed '5,$d' file.txt |
Cas pratiques
# CSV : supprimer en-tête
sed '1d' export.csv > data.csv
# Logs : garder seulement 100 premières lignes
sed '101,$d' app.log
# Fichier config : supprimer ligne commentaire (ligne 2)
sed '2d' app.conf
# Supprimer 10 premières lignes
sed '1,10d' file.txt
Vérification avant suppression
# Afficher SEULEMENT ligne à supprimer
sed -n '3p' file.txt # Vérifier ligne 3
# Puis supprimer
sed '3d' file.txt
# Ou directement avec -i + backup
sed -i.bak '3d' file.txt
Différence : d supprime ligne(s), p affiche ligne(s), s modifie contenu.Syntaxe pattern delete
sed '/PATTERN/d' fichier.txt
Supprime toutes les lignes contenant le motif.Exemples courants
# Supprimer lignes contenant "error"
sed '/error/d' app.log
# Supprimer commentaires (commençant par #)
sed '/^#/d' config.sh
# Supprimer lignes vides
sed '/^$/d' file.txt
# Supprimer lignes avec IP spécifique
sed '/192\.168\.1\.10/d' access.log
Patterns utiles
| Pattern | Signification | Exemple |
|---|---|---|
/error/d |
Contient "error" | sed '/error/d' log.txt |
/^#/d |
Commence par # | sed '/^#/d' script.sh |
/^$/d |
Lignes vides | sed '/^$/d' file.txt |
/TODO/d |
Contient TODO | sed '/TODO/d' code.js |
/^\s*$/d |
Vides + espaces | sed '/^\s*$/d' file.txt |
/DEBUG/d |
Niveau DEBUG | sed '/DEBUG/d' app.log |
Nettoyage logs production
# Supprimer DEBUG + INFO (garder WARN/ERROR)
sed -e '/DEBUG/d' -e '/INFO/d' app.log > critical.log
# Supprimer lignes avec IP privées
sed '/192\.168/d' access.log
# Nettoyer fichier config (commentaires + vides)
sed -e '/^#/d' -e '/^$/d' nginx.conf
Inversion (supprimer ce qui NE contient PAS)
# Garder SEULEMENT lignes avec "error"
sed '/error/!d' app.log
# |
# +-> ! = NOT (inverse)
# Supprimer tout SAUF commentaires
sed '/^#/!d' script.sh
Cas DevOps
# CI/CD : filtrer logs
sed '/^\[INFO\]/d' build.log > errors-only.log
# Monitoring : supprimer checks santé
sed '/healthcheck/d' access.log
# Sécurité : anonymiser données sensibles
sed -e '/password/d' -e '/token/d' dump.log
Astuce : Tester avec -n '/pattern/p' avant de supprimer avec /pattern/d.Commande i (insert)
sed 'ADRESSEi\TEXTE' fichier.txt
Insère TEXTE avant la ligne ciblée.Exemples numéro de ligne
# Insérer avant ligne 1 (en-tête)
sed '1i\# Header' file.txt
# Insérer avant ligne 5
sed '5i\--- Section ---' doc.md
# Insérer avant dernière ligne
sed '$i\Footer' file.txt
Syntaxe alternative (POSIX vs GNU)
# GNU sed (Linux) : backslash simple
sed '1i\Header' file.txt
# POSIX sed (macOS/BSD) : newline requis
sed '1i\
Header' file.txt
# Portable (fonctionne partout)
sed -e '1i\' -e 'Header' file.txt
Insertion par pattern
# Insérer avant première ligne contenant "[database]"
sed '/^\[database\]/i\# Configuration database' config.ini
# Insérer avant chaque ligne "error"
sed '/error/i\--- Error detected ---' app.log
# Insérer commentaire avant fonction main
sed '/^def main/i\# Entry point' script.py
Cas d'usage pratiques
# Ajouter shebang au début d'un script
sed '1i\#!/bin/bash' script.sh
# Insérer en-tête CSV
sed '1i\Name,Email,Age' data.csv
# Ajouter DOCTYPE HTML
sed '1i\<!DOCTYPE html>' page.html
# Insérer import dans Python
sed '1i\import logging' app.py
Multi-lignes
# Insérer plusieurs lignes (GNU sed)
sed '1i\Line 1\nLine 2\nLine 3' file.txt
# Ou avec plusieurs commandes
sed -e '1i\Line 1' -e '1i\Line 2' file.txt
Modification en place
# Insérer + sauvegarder
sed -i '1i\# Auto-generated' config.yaml
# Avec backup
sed -i.bak '1i\#!/usr/bin/env python3' script.py
Différence : i insère avant, a insère après.Commande a (append)
sed 'ADRESSEa\TEXTE' fichier.txt
Ajoute TEXTE après la ligne ciblée.Exemples par numéro
# Ajouter après ligne 3
sed '3a\New line after 3' file.txt
# Ajouter à la fin ($)
sed '$a\Footer line' file.txt
# Ajouter après ligne 1
sed '1a\Second line' file.txt
Par pattern (motif)
# Après chaque ligne contenant "[section]"
sed '/^\[section\]/a\key=value' config.ini
# Après balise <head>
sed '/<head>/a\ <meta charset="UTF-8">' index.html
# Après import logging
sed '/^import logging/a\import sys' app.py
Cas d'usage DevOps
# Injecter analytics après <body>
sed '/<body>/a\<script src="analytics.js"></script>' index.html
# Ajouter route après section routes
sed '/# Routes/a\app.get("/health", healthCheck)' server.js
# Ajouter variable après environnement
sed '/^\[production\]/a\DEBUG=False' .env
# Footer dans README
sed '$a\\n## License\nMIT' README.md
Multi-lignes
# Ajouter plusieurs lignes (GNU sed)
sed '5a\Line A\nLine B\nLine C' file.txt
# Avec -e
sed -e '5a\Line A' -e '5a\Line B' file.txt
Insertion conditionnelle
# Ajouter seulement après première occurrence
sed '0,/pattern/a\New line' file.txt
# Ajouter si pattern trouvé
sed '/TODO/a\# FIXME: urgent' code.js
Différence i vs a
| Commande | Position | Exemple |
|---|---|---|
i |
Avant ligne | sed '3i\Before 3' file.txt |
a |
Après ligne | sed '3a\After 3' file.txt |
# Fichier original
Line 1
Line 2
Line 3
# Avec i (insert avant)
sed '2i\NEW' file
Line 1
NEW
Line 2
Line 3
# Avec a (append après)
sed '2a\NEW' file
Line 1
Line 2
NEW
Line 3
Astuce : Utiliser -n et p pour tester avant modification : sed -n '3p' file.txt.Commande c (change)
sed 'ADRESSEc\NOUVEAU_CONTENU' fichier.txt
Remplace entièrement la ligne (supprime ancien contenu).Exemples par numéro
# Remplacer ligne 5
sed '5c\New content for line 5' file.txt
# Remplacer ligne 1 (header)
sed '1c\# New Title' README.md
# Remplacer dernière ligne
sed '$c\End of file' file.txt
Par pattern
# Remplacer ligne contenant "DEBUG"
sed '/DEBUG=true/c\DEBUG=false' config.sh
# Remplacer ligne de version
sed '/^version=/c\version=2.0.0' package.conf
# Remplacer ligne import obsolète
sed '/^import old_module/c\import new_module' script.py
Différence s vs c
| Commande | Action | Exemple | Résultat |
|---|---|---|---|
s |
Substitution partielle | sed 's/foo/bar/' |
Garde le reste de la ligne |
c |
Remplacement total | sed '2c\NEW' |
Ligne complètement remplacée |
# Fichier
cat file.txt
Line 1 with foo
Line 2 with foo
Line 3
# Avec s (substitution)
sed '2s/foo/bar/' file.txt
Line 1 with foo
Line 2 with bar # "Line 2 with" conservé
Line 3
# Avec c (change)
sed '2c\bar' file.txt
Line 1 with foo
bar # Tout remplacé
Line 3
Cas pratiques
# Config : remplacer ligne port
sed '/^port=/c\port=9090' app.conf
# Mise à jour variable environnement
sed '/^export PATH=/c\export PATH=/usr/local/bin:$PATH' .bashrc
# Dockerfile : nouvelle base image
sed '/^FROM/c\FROM node:18-alpine' Dockerfile
# Makefile : nouvelle commande
sed '/^build:/c\build: clean compile' Makefile
Plages de lignes
# Remplacer lignes 2 à 4 par une seule
sed '2,4c\Single replacement line' file.txt
# Remplacer tout sauf ligne 1
sed '2,$c\All replaced' file.txt
Modification en place
# Remplacer + sauvegarder
sed -i '/old_value/c\new_value' config.yaml
# Avec backup
sed -i.bak '5c\Updated line' file.txt
Résumé : c = remplacement complet de ligne, s = modification partielle.Option -i (in-place)
sed -i 'COMMANDE' fichier.txt
Effet : Modifie le fichier directement (pas de redirection nécessaire).Comportement par défaut vs -i
# SANS -i : affichage stdout (fichier inchangé)
sed 's/foo/bar/g' file.txt
# Affiche résultat, file.txt intact
# Redirection manuelle
sed 's/foo/bar/g' file.txt > output.txt
# file.txt intact, résultat dans output.txt
# AVEC -i : modification directe
sed -i 's/foo/bar/g' file.txt
# file.txt modifié, pas de sortie stdout
Différences Linux (GNU) vs macOS (BSD)
| Système | Syntaxe | Obligatoire |
|---|---|---|
| Linux | sed -i 's/foo/bar/' file.txt |
Extension optionnelle |
| macOS | sed -i '' 's/foo/bar/' file.txt |
Extension requise (vide = '') |
# Linux/GNU sed
sed -i 's/old/new/' file.txt
# macOS/BSD sed (ERREUR sans '')
sed -i 's/old/new/' file.txt # ❌ ERREUR
sed -i '' 's/old/new/' file.txt # ✅ OK
# Portable (fonctionne partout)
sed -i.bak 's/old/new/' file.txt
Cas d'usage DevOps
# CI/CD : mise à jour version
sed -i 's/version: 1.0.0/version: 1.1.0/' Chart.yaml
# Déploiement : changement environnement
sed -i 's/NODE_ENV=development/NODE_ENV=production/' .env
# Config serveur : mise à jour port
sed -i 's/listen 80/listen 8080/' nginx.conf
# Ansible : templating dynamique
sed -i 's/{{DB_HOST}}/postgres.local/' config.php
Modification masse
# Tous les fichiers .conf
find /etc/app -name '*.conf' -exec sed -i 's/old/new/g' {} \;
# Tous les .js du projet
find src -name '*.js' -exec sed -i 's/var /let /g' {} +
# Avec confirmation
find . -name '*.txt' -exec sed -i.bak 's/foo/bar/g' {} \;
Sécurité
# ⚠️ DANGER : sans backup
sed -i 's/important/data/' critical.conf
# ✅ RECOMMANDÉ : avec backup
sed -i.bak 's/important/data/' critical.conf
# Crée critical.conf.bak
# Test avant (-n pour dry-run visuel)
sed -n 's/old/new/gp' file.txt # Voir changements
sed -i 's/old/new/g' file.txt # Appliquer
Bonne pratique : Toujours utiliser -i.bak en production, ou tester sans -i d'abord.Option -i.EXTENSION
sed -i.EXTENSION 'COMMANDE' fichier.txt
Crée fichier.txt.EXTENSION (backup) avant modification.Exemples extensions courantes
# Extension .bak
sed -i.bak 's/old/new/g' config.txt
# Crée config.txt.bak
# Extension .orig
sed -i.orig 's/foo/bar/' script.sh
# Crée script.sh.orig
# Extension datée
sed -i.$(date +%Y%m%d) 's/old/new/' file.txt
# Crée file.txt.20260108
# Extension timestamp
sed -i.$(date +%s) 's/old/new/' data.csv
# Crée data.csv.1704729600
Workflow sécurisé
# 1. Vérifier changement (dry-run)
sed -n 's/DEBUG/INFO/gp' app.conf
# 2. Appliquer avec backup
sed -i.backup 's/DEBUG/INFO/g' app.conf
# 3. Vérifier résultat
diff app.conf.backup app.conf
# 4. Si OK, supprimer backup
rm app.conf.backup
# 5. Si KO, restaurer
mv app.conf.backup app.conf
Comparaison options
| Option | Backup | Fichier original | Usage |
|---|---|---|---|
sed 's/...' file |
❌ Non | ✅ Intact | Test/affichage |
sed -i 's/...' file |
❌ Non | ❌ Modifié | Risqué |
sed -i.bak 's/...' file |
✅ Oui | ❌ Modifié | Recommandé |
Cas pratiques production
# Déploiement avec backup horodaté
sed -i.$(date +%Y%m%d-%H%M%S) \
's/version=1.0/version=2.0/' /etc/app/config.ini
# Mise à jour configs multiples
for conf in /etc/nginx/sites-enabled/*; do
sed -i.backup 's/listen 80/listen 8080/' "$conf"
done
# Rollback si problème
find /etc/nginx/sites-enabled -name '*.backup' | while read bak; do
mv "$bak" "${bak%.backup}"
done
Nettoyage backups
# Supprimer tous les .bak
find . -name '*.bak' -delete
# Garder backups < 7 jours
find . -name '*.bak' -mtime +7 -delete
# Lister backups avant suppression
find . -name '*.bak' -ls
Différence macOS
# macOS : extension OBLIGATOIRE (même vide)
sed -i '' 's/old/new/' file.txt # Pas de backup
sed -i '.bak' 's/old/new/' file.txt # Avec backup
# Linux : extension optionnelle
sed -i 's/old/new/' file.txt # Pas de backup
sed -i.bak 's/old/new/' file.txt # Avec backup
Règle d'or : Toujours utiliser -i.bak sur fichiers critiques (configs, code source).Support regex intégré
Oui, sed utilise des expressions régulières (ERE/BRE) pour patterns complexes.Syntaxes disponibles
| Mode | Activation | Support |
|---|---|---|
| BRE | Par défaut | Basic Regular Expressions |
| ERE | -E ou -r |
Extended Regular Expressions |
# BRE (par défaut)
sed 's/[0-9]\+/NUM/g' file.txt
# ERE (plus lisible)
sed -E 's/[0-9]+/NUM/g' file.txt
Patterns courants
| Pattern | Signification | Exemple |
|---|---|---|
^ |
Début de ligne | sed 's/^/PREFIX/' file.txt |
$ |
Fin de ligne | sed 's/$/SUFFIX/' file.txt |
. |
N'importe quel caractère | sed 's/a.c/ABC/' file.txt |
* |
0 ou + occurrences | sed 's/a*/X/' file.txt |
[0-9] |
Chiffre | sed 's/[0-9]/#/g' file.txt |
[a-z] |
Lettre minuscule | sed 's/[a-z]/X/g' file.txt |
\w |
Mot (ERE) | sed -E 's/\w+/WORD/g' file.txt |
\s |
Espace (ERE) | sed -E 's/\s+/ /g' file.txt |
Exemples pratiques
# Commenter lignes commençant par chiffre
sed 's/^[0-9]/# &/' file.txt
# Supprimer espaces début/fin ligne
sed 's/^[[:space:]]*//; s/[[:space:]]*$//' file.txt
# Remplacer IP par XXX
sed -E 's/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/XXX.XXX.XXX.XXX/g' log.txt
# Extraire domaine email
sed -E 's/.*@([a-z0-9.-]+).*/\1/' emails.txt
# Valider format téléphone
sed -n '/^[0-9]\{10\}$/p' phones.txt
Groupes de capture
# BRE : \( \) et \1
sed 's/\([a-z]*\)@\([a-z]*\)\.com/User: \1, Domain: \2/' emails.txt
# ERE : ( ) et \1 (plus lisible)
sed -E 's/([a-z]*)@([a-z]*)\.com/User: \1, Domain: \2/' emails.txt
# Inverser prénom nom
sed -E 's/([A-Z][a-z]+) ([A-Z][a-z]+)/\2, \1/' names.txt
# John Doe → Doe, John
Classes POSIX
# [:digit:] = [0-9]
sed 's/[[:digit:]]/#/g' file.txt
# [:alpha:] = [a-zA-Z]
sed 's/[[:alpha:]]/X/g' file.txt
# [:space:] = espaces/tabs
sed 's/[[:space:]]/,/g' file.txt
# [:alnum:] = alphanumérique
sed 's/[^[:alnum:]]//g' file.txt
Cas DevOps avancés
# Logs : extraire timestamp
sed -E 's/^([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}).*/\1/' app.log
# Config : valider format KEY=VALUE
sed -n '/^[A-Z_]\+=[^[:space:]]\+$/p' .env
# CSV : valider email
sed -E '/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/!d' emails.csv
# Markdown : extraire liens
sed -E 's/.*\[([^]]+)\]\(([^)]+)\).*/Link: \1 -> \2/' README.md
Note : -E (ERE) évite d'échapper +, ?, |, () (plus lisible).Option -f (file script)
sed -f SCRIPT.sed fichier.txt
Exécute toutes les commandes du fichier SCRIPT.sed.Structure fichier script
# cleanup.sed
# Supprime commentaires
/^#/d
# Supprime lignes vides
/^$/d
# Remplace tabs par espaces
s/\t/ /g
# Trim espaces fin ligne
s/[[:space:]]*$//
Utilisation :sed -f cleanup.sed config.txt
Cas d'usage : normalisation logs
# normalize-logs.sed
# Anonymiser IP
s/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/XXX.XXX.XXX.XXX/g
# Masquer emails
s/[a-zA-Z0-9._%+-]\+@[a-zA-Z0-9.-]\+\.[a-zA-Z]\{2,\}/***@***.com/g
# Supprimer DEBUG/INFO
/\[DEBUG\]/d
/\[INFO\]/d
# Garder seulement WARN/ERROR
/\[WARN\]/!{/\[ERROR\]/!d}
Application :sed -f normalize-logs.sed app.log > clean.log
Transformation CSV
# csv-transform.sed
# Supprimer header
1d
# Remplacer séparateur ; par ,
s/;/,/g
# Ajouter guillemets colonnes texte
s/^\([^,]*\),\([^,]*\),/"\1","\2",/
# Supprimer lignes vides
/^$/d
Configuration multi-étapes
# deploy-config.sed
# Environnement production
s/DEBUG=true/DEBUG=false/
s/localhost/production.example.com/g
s/port: 3000/port: 8080/
# Database
s/db.local/db.prod.internal/
s/max_connections=10/max_connections=100/
# Logs
s/log_level=debug/log_level=warn/
Déploiement :for conf in *.yaml; do
sed -i.dev -f deploy-config.sed "$conf"
done
Avantages vs -e multiple
| Méthode | Lisibilité | Maintenance | Réutilisabilité |
|---|---|---|---|
-e répété |
❌ Faible | ❌ Difficile | ❌ Non |
-f script.sed |
✅ Haute | ✅ Facile | ✅ Oui |
# Inline (difficile à lire)
sed -e 's/foo/bar/' -e '/^#/d' -e 's/old/new/g' -e '/^$/d' file.txt
# Script (clair)
sed -f transform.sed file.txt
Combinaison -f et -e
# Script + commandes inline
sed -f base-cleanup.sed -e 's/CUSTOM/VALUE/' file.txt
CI/CD : scripts versionnés
# scripts/sed/
├── anonymize.sed # Anonymisation logs
├── config-prod.sed # Config production
├── csv-normalize.sed # Normalisation CSV
└── sanitize.sed # Nettoyage général
# Utilisation pipeline
sed -f scripts/sed/anonymize.sed logs/*.log
Avantage : Scripts sed versionnés = transformations reproductibles et testables.1. Nettoyage logs
# Supprimer DEBUG/INFO
sed -e '/DEBUG/d' -e '/INFO/d' app.log > errors.log
# Anonymiser IP
sed 's/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/XXX.XXX.X.XX/g' access.log
# Supprimer lignes vides + trim
sed -e '/^$/d' -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' app.log
# Garder seulement dernières 1000 lignes
sed -n -e :a -e '1,1000!{P;N;D;};N;ba' huge.log
2. Configuration automatique
# Mise à jour port
sed -i 's/port: 8080/port: 9090/' config.yaml
# Changer environnement
sed -i 's/NODE_ENV=development/NODE_ENV=production/' .env
# Database connection
sed -i 's/localhost:3306/db.prod.local:3306/' app.conf
# Batch configs
find /etc/app -name '*.conf' -exec sed -i.bak 's/old_value/new_value/' {} \;
3. Transformation CSV/données
# Changer séparateur
sed 's/;/,/g' export.csv > import.csv
# Supprimer header
sed '1d' data.csv
# Ajouter guillemets
sed 's/^\|$/"/g; s/,/","/g' data.csv
# Filtrer colonnes (garder 1 et 3)
sed -E 's/^([^,]*),([^,]*),([^,]*).*/\1,\3/' data.csv
4. Scripts : mise à jour chemins
# Changer shebang
sed -i '1s|^#!/usr/bin/python|#!/usr/bin/env python3|' *.py
# Mettre à jour chemins
find . -name '*.sh' -exec sed -i 's|\/old\/path|\/new\/path|g' {} +
# Import modules Python
sed -i 's/^from old_module/from new_module/' **/*.py
5. Templating / injection contenu
# HTML : analytics
sed '/<\/head>/i\<script src="analytics.js"></script>' index.html
# Remplacer variables
sed 's/{{VERSION}}/1.2.3/g; s/{{ENV}}/production/g' template.yaml
# Génération config depuis template
sed -e "s/{{DB_HOST}}/$DB_HOST/" \
-e "s/{{DB_PORT}}/$DB_PORT/" \
template.conf > app.conf
6. CI/CD : déploiement automatisé
# Mise à jour version package.json
sed -i "s/\"version\": \".*\"/\"version\": \"$NEW_VERSION\"/" package.json
# Dockerfile : nouvelle base image
sed -i "s/^FROM .*/FROM node:${NODE_VERSION}-alpine/" Dockerfile
# Kubernetes : namespace
sed "s/namespace: dev/namespace: $DEPLOY_ENV/" k8s/*.yaml
7. Conversion formats
# DOS → Unix (CRLF → LF)
sed -i 's/\r$//' file.txt
# Unix → DOS (LF → CRLF)
sed -i 's/$/\r/' file.txt
# Markdown → Plain text (supprimer liens)
sed -E 's/\[([^]]+)\]\([^)]+\)/\1/g' README.md
8. Validation / extraction
# Extraire emails
sed -n 's/.*\([a-zA-Z0-9._%+-]\+@[a-zA-Z0-9.-]\+\.[a-zA-Z]\{2,\}\).*/\1/p' file.txt
# Valider format IP
sed -n '/^[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}$/p' ips.txt
# Extraire URLs
sed -n 's/.*https\?:\/\/\([^[:space:]]\+\).*/\1/p' links.txt
Récapitulatif par domaine
| Domaine | Usage sed | Fréquence |
|---|---|---|
| DevOps | Config auto, templating | ⭐⭐⭐⭐⭐ |
| SysAdmin | Logs, maintenance | ⭐⭐⭐⭐⭐ |
| Data Engineering | CSV, transformations | ⭐⭐⭐⭐ |
| CI/CD | Versioning, déploiement | ⭐⭐⭐⭐ |
| Scripting | Automatisation | ⭐⭐⭐⭐⭐ |