sed : éditer fichiers et flux en place
À la fin de ce tutoriel sed linux, vous saurez substituer avec
s/pattern/rempl/flags, adresser des lignes (numéro, plage,/regex/), éditer en place viased -i/sed -i.bak, manipuler brièvementd/a/i/c, et utiliser le hold space (h/H,g/G,x) pour des cas ops courants — labs factices sous/tmp/lab-sed, enchaînés après awk pratique et avant les pipelines texte.Niveau : Intermédiaire · Temps estimé : 45–55 min · Versions testées : Ubuntu 22.04 / 24.04, Debian 12 (GNU sed) ; note macOS/BSD
sed -i ''· Dernière vérification : 2026-09-11Slug proposé :
linux-sed-edition· Série : Linux Shell & Automation · Remplace / fusionne : N/A — création
Prérequis
- Hub Linux Shell & Automation
- awk pratique (colonnes / agrégats) et grep / ripgrep (filtrer avant d’éditer)
sed(GNU) déjà présent :sed --version(sous BSD/macOS la syntaxe-idiffère — une note plus bas)- Lab entièrement dans
/tmp/lab-sed; pas de secrets, mots de passe ou chemins WordPress live dans les exemples
Coût : 0 €. Les commandes ci-dessous ciblent GNU sed (Ubuntu/Debian/Rocky). Sur macOS, préférez gsed ou adaptez -i ''.
Ce que nous allons construire
Jeux lab (/tmp/lab-sed)
→ s/// · flags g,i,N · adressage
→ sed -i / -i.bak (backup)
→ d a i c (delete / append / insert / change)
→ Hold space : h H g G x (intro ops)
→ Pipeline grep|sed|awk · quotes
→ Nettoyage
(Schéma à remplacer par une image locale Excalidraw / draw.io, alt : « sed linux : substitution s///, adressage, sed -i, hold space, pipelines ».)
Chapitre édition de la série (plan-45, col. Shell). grep/rg trouvent ; awk structure ; sed transforme. Réflexe : dry-run sans -i, puis seulement écrire.
Étape 1 — Données lab : config, hosts-like, logs
mkdir -p /tmp/lab-sed && cd /tmp/lab-sed
cat > config.ini << 'EOF'
[app]
env=dev
debug=true
listen=0.0.0.0
[db]
host=203.0.113.10
port=5432
name=appdb
EOF
cat > hosts.lab << 'EOF'
127.0.0.1 localhost
203.0.113.10 api.dev.example
203.0.113.50 db.dev.example
192.0.2.10 bastion.lab
# legacy
203.0.113.10 old-api.example
EOF
cat > access.log << 'EOF'
203.0.113.10 GET /health 200
203.0.113.50 POST /login 401
203.0.113.50 POST /login 401
192.0.2.10 GET / 200
203.0.113.50 GET /admin 403
EOF
cp config.ini config.ini.orig
wc -l config.ini hosts.lab access.log
IP RFC 5737 (203.0.113.0/24, 192.0.2.0/24) — doc only, jamais de prod réelle.
Étape 2 — Substitution s/// et flags
Cœur de sed linux : s/pattern/remplacement/flags. Sans flag = 1re occurrence/ligne ; g = toutes ; i (GNU) = casse ignorée ; un nombre = nième.
cd /tmp/lab-sed
# Dry-run : stdout seulement
sed 's/dev/staging/' config.ini
sed 's/true/false/g' config.ini
echo '203.0.113.10 and 203.0.113.50' | sed 's/203/DOC/2'
echo 'Debug=TRUE' | sed 's/debug/trace/i'
sed 's|/health|/ready|g' access.log
| Flag / forme | Rôle |
|---|---|
| (aucun) | 1re occurrence par ligne |
g |
Toutes les occurrences de la ligne |
i / I |
Ignore la casse (GNU) |
2, 3… |
Nième occurrence seulement |
s|a|b| |
Délimiteur autre que / (utile avec chemins) |
Quotes : simples autour du programme (évite
$,!). Variables :sed "s/${OLD}/${NEW}/g"— échappez alors le motif.
Étape 3 — Adressage : numéro, plage, /regex/
Sans adresse, sed traite chaque ligne ; avec adresse, vous limitez l’action.
cd /tmp/lab-sed
# Ligne 2 seulement
sed '2s/dev/staging/' config.ini
# Plage lignes 5–7 (section [db] approximative)
sed '5,7s/203.0.113.10/198.51.100.10/' config.ini
# Adresse regex : lignes contenant « legacy » ou commentaire
sed '/^#/d' hosts.lab
# De la 1re ligne « [db] » jusqu’à la fin de section simple
sed '/^[db]/,/^[/{ s/host=.*/host=198.51.100.20/; }' config.ini
# Afficher seulement les lignes match (équivalent filtre)
sed -n '/401/p' access.log
| Adresse | Exemple | Effet |
|---|---|---|
N |
3d |
Ligne N |
N,M |
2,4s/a/b/ |
Plage inclusive |
/re/ |
/ERROR/d |
Lignes matchant la regex |
/a/,/b/ |
/[app]/,/^[/ |
De motif A à motif B |
$ |
$d |
Dernière ligne |
-n coupe la sortie auto ; couplez avec p pour imprimer à la demande.
Étape 4 — sed -i et sed -i.bak (danger prod)
sed -i réécrit le fichier. Faute de regex = config cassée. Habitude : backup (-i.bak) ou dry-run puis redirection.
cd /tmp/lab-sed
# Backup explicite .bak (GNU sed)
sed -i.bak 's/env=dev/env=staging/' config.ini
diff -u config.ini.bak config.ini || true
# Restaurer pour la suite du lab
cp config.ini.orig config.ini
# Chaîne sûre : écrire ailleurs, puis mv atomique
sed 's/debug=true/debug=false/' config.ini > config.ini.new
&& mv config.ini.new config.ini
cat config.ini | head -n 5
# Remettre l’original
cp config.ini.orig config.ini
| Variante | Comportement |
|---|---|
sed -i '…' f |
GNU : édition sans backup |
sed -i.bak '…' f |
GNU : crée f.bak puis édite |
sed -i '' '…' f |
BSD/macOS : -i exige une extension (souvent '' = pas de backup) |
stdout + mv |
Portable, revue possible avant mv |
Prod : préférez Ansible/envsubst/templates ; gardez sed -i pour hotfix lab/CI. Vérifiez sed --version : GNU vs BSD cassent souvent les scripts (-i).
Étape 5 — d, a, i, c (bref)
cd /tmp/lab-sed
# d : delete
sed '/^#/d' hosts.lab
# i : insert AVANT la ligne adressée ; a : append APRÈS
sed '/bastion.lab/i10.0.0.1 jump.lab' hosts.lab
sed '/localhost$/a::1 localhost-ipv6' hosts.lab
# c : remplace la ligne entière
sed '/old-api/c198.51.100.30 retired.example' hosts.lab
| Commande | Rôle |
|---|---|
d |
Supprime la ligne adressée |
i |
Insère du texte avant |
a |
Ajoute du texte après |
c |
Change (remplace) la ligne |
Sous GNU, a/i/c acceptent le texte après . Gros blocs : here-doc + cat souvent plus lisible.
Étape 6 — Hold space : h/H, g/G, x (intro ops)
Deux buffers : pattern space (ligne) et hold space (mémoire) — pour garder une ligne et la réinjecter plus tard.
cd /tmp/lab-sed
# h : pattern → hold ; g : hold → pattern ; x : échange
sed -n '1{h;p;}; $ {p;x;p;}' config.ini
# H / G : append avec newline
printf 'alphanbetan' | sed '1h;1d;2G'
# Ops : mémoriser la 1re IP, la rappeler en fin
sed -n '1s/^([0-9.]*).*/1/;1h;1p; ${x;s/^/FIRST_IP=/;p;}' access.log
| Cmd | Effet |
|---|---|
h |
hold ← pattern (écrase) |
H |
hold ← hold + n + pattern |
g |
pattern ← hold (écrase) |
G |
pattern ← pattern + n + hold |
x |
échange pattern ↔ hold |
Pour 90 % des tickets, s/// + adressage suffisent. Hold space = one-liners « mémoriser / coller » ; au-delà → awk ou script.
Étape 7 — Pipeline grep|sed|awk et quotes
cd /tmp/lab-sed
grep '401' access.log | sed 's/POST/WRITE/' | awk '{print $1, $NF}'
sed -E 's/b203.0.113.[0-9]+b/203.0.113.xxx/g' access.log
OLD=dev; sed "s/${OLD}/staging/g" config.ini | head -n 3
# Simples : ${OLD} reste littéral
sed 's/${OLD}/staging/g' config.ini | head -n 2 || true
Enchaînement série : rg/grep → sed → awk → pipelines texte.
Nettoyage lab
cd /tmp
rm -rf /tmp/lab-sed
echo "lab sed nettoyé — OK"
Validé si : s/// + flags, adressage, sed -i.bak (note BSD), d/a/i/c, intro hold space, pipe grep|sed|awk sous /tmp sans secrets.
Erreurs fréquentes
| Symptôme | Cause | Correction |
|---|---|---|
Fichier inchangé après sed 's/…/' f |
Pas de -i (stdout only) |
Rediriger ou sed -i.bak |
| Config perdue | sed -i sans backup |
Toujours -i.bak ou > f.new && mv |
| Script casse sur Mac | GNU -i vs BSD -i '' |
Documenter ; utiliser gsed ou stdout+mv |
$var vide / bizarre |
Doubles quotes + shell | Simples autour du programme ; -e clair |
| Seule la 1re occurrence change | Flag g oublié |
s/a/b/g |
sed: -e expression #1 |
Slash dans le motif | s|/path|/new| ou échapper |
| Hold space « mangé » | h au lieu de H |
H/G pour concaténer |
Triade à retenir : dry-run → adressage → -i.bak.
Quiz (3 questions)
1. Que fait sed 's/foo/bar/g' fichier sans -i ?
– A. Modifie le fichier sur disque
– B. Affiche le résultat sur stdout ; le fichier reste intact
– C. Supprime toutes les lignes
2. À quoi sert sed -i.bak 's/a/b/' f sous GNU sed ?
– A. Ignorer les backups Git
– B. Créer f.bak puis éditer f en place
– C. Compiler un binaire
3. Que fait la commande x dans sed ?
– A. Quitte le shell
– B. Échange pattern space et hold space
– C. Active le mode XML
Réponses : 1‑B · 2‑B · 3‑B
FAQ
sed ou awk pour remplacer du texte ?
sed : substitutions ligne à ligne et édition légère. awk : champs ($1), agrégats, rapports. Souvent les deux dans le même pipe.
Pourquoi mon sed -i échoue sur macOS ?
BSD : sed -i '' 's/a/b/' f (ou .bak). GNU Linux : sed -i / -i.bak. Multi-OS : stdout + mv, ou gsed.
Le hold space remplace-t-il un script ?
Non : mémoire pour one-liners. Au-delà de deux x, préférez un script bash/awk (revue PR).
Pour aller plus loin
man sed, info sed (GNU) ; comparer avecssed/gsedsi besoin- Suite : Pipelines texte : cut, sort, uniq, xargs et jq
- Hub : Linux Shell & Automation · préc. awk pratique
Maillage série Linux Shell & Automation
| ← Précédent | awk pratique : colonnes, agrégats et rapports |
| → Suivant | Pipelines texte : cut, sort, uniq, xargs et jq |
| Hub | Linux Shell & Automation |
Meta publication (à remplir dans Rank Math / SEO)
- Title SEO : sed : éditer fichiers et flux en place (2026)
- Meta description (≤ 155) : Éditez flux et fichiers avec sed linux (s///, -i, hold space). Guide Shell Automation DevOps 2026.
- Focus keyphrase : sed linux
- KW secondaires : sed -i, substitution, hold space
- Schemas Rank Math : Article + HowTo (étapes lab) + FAQ (3 questions ci-dessus)
- Image mise en avant :
assets/web/devopelastichayway/cover-linux-sed-edition-1200x630.webp(Visuels Linux — WebP 1200×630) - Catégorie : Linux · Niveau : Intermédiaire
- Slug :
linux-sed-edition - Statut : FEU VERT publish (Linux Cours 2026-09-11) — prêt batch WP-CLI
← Retour parcours Linux — Basics, Admin, Réseau & Sécurité, Shell & Automation.