Aller au contenu principal

Rechercher et remplacer (ou ajouter) avec sed

Maîtrisez sed sous Linux pour éditer vos fichiers dynamiquement. Apprenez à remplacer une variable existante ou à ajouter simplement une nouvelle ligne si la variable est absente de votre fichier de configuration.

· 5 minutes de lecture
Voir la source
Christophe
Amoureux de Markdown, WSL et Docker ~ Curieux insatiable.
Cet article existe aussi en anglais — lire la version originale.

Traduction automatique

Cette traduction a été produite par une IA. Elle peut contenir des contresens ou des maladresses, en particulier sur les termes techniques. En cas de doute, consultez l'article de référence en anglais — c'est lui qui fait foi.

Cet article a plus d'un an, mais il a été relu le 30 juillet 2026 — son contenu est toujours exact.

Rechercher et remplacer (ou ajouter) avec sed

⚡
TL;DR

Cet article explique comment utiliser sed pour mettre à jour une variable dans un fichier de config ou un .env quand elle existe déjà, et comment le combiner avec grep -q pour l'ajouter quand elle est absente — un seul pattern fiable « rechercher et remplacer, ou insérer » pour éditer des fichiers depuis un script.

Aujourd'hui, j'ai rencontré (encore une fois) le besoin suivant : je dois mettre à jour un paramètre dans un fichier texte mais si la variable n'est pas encore présente, je dois l'ajouter.

Bref, je dois faire un rechercher et remplacer ou insérer une nouvelle ligne.

Avec sed, automatiser le rechercher/remplacer est assez simple, mais comment ajouter une ligne ?

Le one-liner​

Le voici — mettre à jour APP_ENV si la clé existe, l'ajouter sinon :

>user@machine: ~/yourproject

Le fichier .env ne contenait que APP_NAME, donc la clé a été ajoutée. Relisons le fichier :

>user@machine: ~/yourproject

Relancez exactement le même bloc — ou lancez-le sur un fichier où APP_ENV existe déjà — et la ligne est remplacée au lieu d'être dupliquée. C'est tout l'intérêt : la commande est idempotente, vous pouvez l'utiliser dans un script de déploiement sans rien vérifier au préalable.

Pourquoi ça marche​

  • grep -q teste sans rien afficher. -q signifie quiet : aucune sortie, seulement un code de retour, exactement ce dont une condition a besoin.
  • && est la branche « trouvé ». La clé existe → on remplace la valeur sur place.
  • || est la branche « absent ». La clé n'existe pas → on ajoute une nouvelle ligne à la fin du fichier.

Vous trouverez plein d'autres solutions sur Internet, certaines n'utilisant que l'instruction sed, mais... arrivez-vous à les lire ? Je préfère cette approche, peut-être pas la plus native, mais au moins je peux la relire.

La suite de cet article construit la commande morceau par morceau, si vous voulez comprendre chaque moitié avant de l'utiliser.

Rechercher et remplacer​

Imaginez un fichier .env avec une seule ligne (que votre script Bash peut ensuite charger comme de vraies variables d'environnement), par exemple :

>user@machine: ~/yourproject

Je peux mettre à jour APP_ENV par exemple avec :

>user@machine: ~/yourproject

Facile, non ? Le s de la commande signifie substitute (remplacer) et le délimiteur utilisé est /. sed va donc chercher APP_ENV =.* et, si trouvé, remplacer par APP_ENV = production. Le flag -i indique que le nouveau contenu (après remplacement) doit être réécrit dans le fichier.

Ne pas remplacer mais ajouter si absent​

Mais que se passe-t-il si APP_ENV n'est pas du tout présent dans le fichier ?

Évidemment, en lançant sed -i "s/APP_ENV =.*/APP_ENV = production/" .env il ne se passera rien (vous pouvez le vérifier avec cat .env).

Avant de voir comment faire, lancez le bloc suivant et vous obtiendrez un message NOT FOUND.

>user@machine: ~/yourproject

Donc si grep -q réussit (on a bien trouvé APP_ENV dans le fichier) alors on continue (&&) et on affiche FOUND, sinon (||) on affiche NOT FOUND.

&& signifie que la commande précédente a réussi (c'est-à-dire que grep a trouvé la ligne) et || signifie qu'elle a échoué (rien trouvé).

L'exemple suivant affichera donc FOUND.

>user@machine: ~/yourproject

La commande pour insérer une nouvelle ligne est celle-ci : sed -i -e '$aAPP_ENV = production' .env. L'argument -e permet d'exécuter un script et c'est assez étrange, mais le script c'est $a. Cette commande sert à ajouter une ligne. Vous avez donc compris que sed va ici ajouter une nouvelle ligne dans le fichier.

Combiner les deux​

Ok, commençons par brancher l'instruction de remplacement sur la branche && :

>user@machine: ~/yourproject

APP_ENV était présent, il a donc été remplacé : lancer cat .env donne bien, comme prévu, APP_ENV = production.

Et le bloc suivant affichera toujours NOT FOUND, parce que cette fois la clé est absente :

>user@machine: ~/yourproject

Remplacez ce echo "NOT FOUND" par la commande d'ajout vue plus haut et vous obtenez le one-liner présenté en début d'article. Les deux moitiés sont maintenant en place.

Conclusion​

grep -q pour le test, && pour remplacer, || pour ajouter : trois morceaux que vous pouvez lire à voix haute, dans une seule commande qui se comporte pareil que la clé soit déjà là ou non. C'est le genre de ligne qu'on finit par coller dans tous ses scripts de déploiement.

Ce pattern est la brique de base de Édition en masse d'un fichier d'environnement, où la même logique devient une fonction réutilisable qui signale UPDATED ou ADDED pour chaque clé traitée.


Cet article vous a-t-il été utile ?
Avez-vous suivi les étapes de cet article ?