Commande sed : remplacement de chaînes, suppression de lignes et option -i

Environnement de testFamille RHELAlmaLinux 9.8Compte rootVérifié le 2026-10-28

La commande sed est un outil Linux qui lit un fichier ligne par ligne et exécute des remplacements, des suppressions et des insertions, ce qui vous permet de modifier les valeurs d'un fichier de configuration sans ouvrir d'éditeur. En exécutant sed sur une copie du fichier wp-config.php de WordPress sur un serveur AlmaLinux 9, nous avons pu changer le nom de la base de données tout en conservant l'original avec -i.bak.

Les messages d'erreur de cet article sont reproduits tels qu'ils s'affichent avec une locale anglaise.

1️⃣ Utilisation de base de la commande sed et remplacement avec s

La commande s, la plus utilisée, remplace des chaînes au format [s/chaîne à chercher/chaîne de remplacement/]. Elle ne remplace que la première occurrence de chaque ligne.

echo 'http://example.com http://example.com/blog' | sed 's/http:/https:/'
https://example.com http://example.com/blog

Pour remplacer toutes les occurrences d'une ligne, ajoutez le drapeau g à la fin.

echo 'http://example.com http://example.com/blog' | sed 's/http:/https:/g'
https://example.com https://example.com/blog

Si vous ajoutez un nom de fichier à la fin, sed lit ce fichier et affiche le résultat modifié. Sur une copie de wp-config-sample.php de WordPress nommée wp-config.php, nous avons changé la valeur de DB_USER et vérifié uniquement cette ligne avec grep.

sed 's/username_here/wp_user/' wp-config.php | grep DB_USER
define( 'DB_USER', 'wp_user' );

Comme la valeur a changé dans la sortie, on croit facilement que le fichier a changé aussi, mais sans option sed affiche seulement le résultat à l'écran et laisse le fichier d'origine intact. En cherchant de nouveau la même ligne dans le fichier, la valeur initiale était toujours là.

grep DB_USER wp-config.php
define( 'DB_USER', 'username_here' );

Pour modifier aussi le fichier d'origine, utilisez l'option -i de 4️⃣.

2️⃣ Sélectionner des lignes avec sed par numéro et par motif (-n, p)

Sans adresse, la commande s s'applique à toutes les lignes. Pour ne traiter que certaines lignes, écrivez un numéro de ligne ou un motif comme adresse devant la commande. -n désactive l'affichage automatique et p affiche les lignes sélectionnées. Ensemble, ils n'affichent que la ligne 23.

sed -n '23p' wp-config.php
define( 'DB_NAME', 'database_name_here' );

Deux numéros de ligne reliés par une virgule affichent cette plage. Les lignes 23 à 32 forment la section contenant les réglages du nom de la base de données, de l'utilisateur, du mot de passe et de l'hôte.

sed -n '23,32p' wp-config.php
define( 'DB_NAME', 'database_name_here' );

/** Database username */
define( 'DB_USER', 'username_here' );

/** Database password */
define( 'DB_PASSWORD', 'password_here' );

/** Database hostname */
define( 'DB_HOST', 'localhost' );

Si vous écrivez un motif entre barres obliques à la place d'un numéro de ligne, toutes les lignes contenant ce motif sont sélectionnées.

sed -n '/DB_/p' wp-config.php
define( 'DB_NAME', 'database_name_here' );
define( 'DB_USER', 'username_here' );
define( 'DB_PASSWORD', 'password_here' );
define( 'DB_HOST', 'localhost' );
define( 'DB_CHARSET', 'utf8mb4' );
define( 'DB_COLLATE', '' );

La commande [=] affiche le numéro de la ligne sélectionnée. L'adresse $ désigne la dernière ligne, donc [$=] permet de connaître le nombre total de lignes du fichier.

sed -n '/DB_HOST/=' wp-config.php
32
sed -n '$=' wp-config.php
102

Une adresse peut aussi précéder la commande s. Voici le résultat du remplacement de localhost à la seule ligne 32, avec l'affichage de la seule ligne modifiée grâce au drapeau p.

sed -n '32s/localhost/127.0.0.1/p' wp-config.php
define( 'DB_HOST', '127.0.0.1' );

En exécutant p sans -n, la ligne sélectionnée est apparue une fois de plus. sed lit les lignes une à une dans l'espace de motifs, exécute les commandes, puis affiche automatiquement l'espace de motifs : la ligne 2 affichée par p réapparaît donc avec l'affichage automatique.

sed '2p' wp-config.php | head -n 4
<?php
/**
/**
 * The base configuration for WordPress

Cette lecture ligne par ligne ressemble à un tapis roulant d'usine qui dépose les pièces une à une sur l'établi, les traite, puis passe à la suivante.

Le diagramme ci-dessous permet de comparer étape par étape ce que chaque commande affiche pour chaque ligne.

🧭 Espace de motifs de sed et affichage automatique : p et d sur la ligne 2
Schéma explicatif
⚙️ Commande
$ sed '2p'-n '2p''2d' wp-config.php
Ligne lueExécution de la commande et sortie
Ligne 1 → espace de motifs<?php
➜
Différente de l'adresse 2 : pas de commandeAffichage automatique 1 foisPas de sortie à cause de -n
Ligne 2 → espace de motifs/**
➜
Correspond à l'adresse 2 : exécution de pCorrespond à l'adresse 2 : exécution de d1 fois par p + 1 fois automatiquementSeulement 1 fois par pEfface l'espace de motifs, passe à la ligne suivante
Ligne 3 → espace de motifs * The base configuration for WordPress
➜
Différente de l'adresse 2 : pas de commandeAffichage automatique 1 foisPas de sortie à cause de -n
🖥️ Ce qui s'affiche à l'écran (lignes 1~3)
<?php/**/** * The base configuration for WordPress
p affiche une fois de plus l'espace de motifs : sans -n, la ligne 2 s'affiche donc deux fois.
-n désactive l'affichage automatique : seule la ligne 2 sélectionnée par p s'affiche donc une fois.
d efface l'espace de motifs et passe à la ligne suivante : la ligne 2 n'est donc pas affichée automatiquement.

3️⃣ Supprimer et insérer des lignes avec la commande sed (d, i, a)

d supprime les lignes sélectionnées. Pour voir l'exemple de configuration nginx ci-dessous sans les lignes de commentaire, sélectionnez avec le motif [^ *#] les lignes qui commencent par # ou qui n'ont que des espaces devant #.

cat example.conf
# example.com
server {
    listen 80;
    server_name example.com www.example.com;

    # document root
    root /var/www/example.com;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }
}
sed '/^ *#/d' example.conf
server {
    listen 80;
    server_name example.com www.example.com;

    root /var/www/example.com;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }
}

Avec des commandes reliées par un point-virgule, [^$], qui désigne une ligne vide, est aussi supprimé. Les deux lignes vides restantes ont disparu après la suppression des commentaires, et seules les lignes de configuration sont restées.

sed '/^ *#/d; /^$/d' example.conf
server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/example.com;
    index index.php index.html;
    location / {
        try_files $uri $uri/ /index.php?$args;
    }
}

i insère du texte avant la ligne sélectionnée et a l'insère après. Voici le résultat de l'insertion d'une ligne de commentaire avant la ligne 1.

sed '1i # managed by sed' example.conf | head -n 3
# managed by sed
# example.com
server {

On croit facilement qu'un texte indenté après a garde son indentation, mais GNU sed ignore les espaces qui suivent a et n'insère que le texte.

sed '/index index.php/a    client_max_body_size 64M;' example.conf
# example.com
server {
    listen 80;
    server_name example.com www.example.com;

    # document root
    root /var/www/example.com;
    index index.php index.html;
client_max_body_size 64M;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }
}

Pour conserver l'indentation, ajoutez une barre oblique inverse après a. Tout ce qui suit la barre oblique inverse, espaces compris, est inséré comme texte.

sed '/index index.php/a\    client_max_body_size 64M;' example.conf
# example.com
server {
    listen 80;
    server_name example.com www.example.com;

    # document root
    root /var/www/example.com;
    index index.php index.html;
    client_max_body_size 64M;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }
}

c remplace entièrement la ligne sélectionnée. Voici les quatre premières lignes du résultat après le passage de la ligne listen 80 à 8080.

sed '/listen 80;/c\    listen 8080;' example.conf | head -n 4
# example.com
server {
    listen 8080;
    server_name example.com www.example.com;

4️⃣ Modifier directement un fichier avec sed -i et nom de la sauvegarde

-i enregistre le résultat dans le fichier d'origine au lieu de l'afficher. Le texte collé juste après -i s'ajoute à la fin du nom du fichier de sauvegarde. wp-config.php et les autres fichiers lus par le site se modifient de préférence avec -i.bak, pour garder l'original.

cp wp-config-sample.php wp-config.php
sed -i.bak 's/database_name_here/wordpress_db/' wp-config.php

Avec -i, rien ne s'affiche à l'écran : vérifiez donc les fichiers avec ls -l.

ls -l wp-config.php*
-rw-r--r-- 1 root root 3333 Oct 28 15:13 wp-config.php
-rw-r--r-- 1 root root 3339 Oct 28 15:13 wp-config.php.bak

Le fichier modifié et le fichier .bak sont maintenant côte à côte. La taille a diminué de 6 octets, car database_name_here est devenu wordpress_db, plus court. En comparant les deux fichiers avec diff, seule la ligne modifiée apparaît.

diff wp-config.php.bak wp-config.php
23c23
< define( 'DB_NAME', 'database_name_here' );
---
> define( 'DB_NAME', 'wordpress_db' );

La ligne modifiée est la seule ligne DB_NAME, à la ligne 23.

S'il y a plusieurs valeurs à changer, enchaînez les scripts avec -e et exécutez-les en une fois.

sed -i -e 's/username_here/wp_user/' -e 's/password_here/wp_pass/' wp-config.php
grep -n -e DB_USER -e DB_PASSWORD wp-config.php
26:define( 'DB_USER', 'wp_user' );
29:define( 'DB_PASSWORD', 'wp_pass' );

Si vous collez -i et -e sous la forme [-ie], le e est lu comme partie du nom de sauvegarde, et un fichier wp-config.phpe est apparu comme ci-dessous.

sed -ie 's/127.0.0.1/localhost/' wp-config.php
ls wp-config.php*
wp-config.php
wp-config.php.bak
wp-config.phpe

-i écrit le contenu modifié dans un nouveau fichier puis le renomme avec le nom d'origine : le numéro d'inode du fichier change donc avant et après l'exécution.

ls -i wp-config.php
207618887 wp-config.php
sed -i 's/localhost/127.0.0.1/' wp-config.php
ls -i wp-config.php
207618883 wp-config.php

Le numéro d'inode, 207618887 avant l'exécution, est passé à 207618883.

Si le fichier n'existe pas ou si vous oubliez le nom de fichier, sed s'arrête avec l'erreur ci-dessous et aucun fichier n'est modifié.

sed -i 's/x/y/' no-such.php
sed: can't read no-such.php: No such file or directory
sed -i 's/x/y/'
sed: no input files

5️⃣ Expressions régulières de sed, changement de séparateur et options

🔲 Expressions régulières et changement de séparateur

Quand vous changez une valeur contenant des barres obliques, comme un chemin, le séparateur de la commande s se mêle aux barres de la valeur : chaque barre oblique de la valeur demande donc une barre oblique inverse.

sed -n 's/\/var\/www\/example.com/\/srv\/www\/example.com/p' example.conf
    root /srv/www/example.com;

Le caractère qui suit directement s devient le séparateur : en passant à |, absent de la valeur, vous obtenez le même résultat sans barre oblique inverse.

sed -n 's|/var/www/example.com|/srv/www/example.com|p' example.conf
    root /srv/www/example.com;

Le point (.) d'un motif correspond à n'importe quel caractère. Voici le résultat d'un motif cherchant example.com qui a aussi modifié exampleXcom.

echo 'exampleXcom example.com' | sed 's/example.com/test.org/g'
test.org test.org

Pour chercher un point littéral, placez une barre oblique inverse devant.

echo 'exampleXcom example.com' | sed 's/example\.com/test.org/g'
exampleXcom test.org

Une partie entre parenthèses se rappelle dans la chaîne de remplacement avec [\1]. Avec -E, les parenthèses et + s'utilisent sans barre oblique inverse. Voici le résultat qui garde le nombre après listen et ajoute default_server.

sed -nE 's/listen ([0-9]+);/listen \1 default_server;/p' example.conf
    listen 80 default_server;

Sans -E, le même script lit les parenthèses comme du texte, et une erreur signale qu'il n'y a pas de groupe à rappeler. Pour travailler sans -E, placez une barre oblique inverse sur les parenthèses et sur +.

sed -n 's/listen ([0-9]+);/listen \1 default_server;/p' example.conf
sed: -e expression #1, char 46: invalid reference \1 on `s' command's RHS
sed -n 's/listen \([0-9]\+\);/listen \1 default_server;/p' example.conf
    listen 80 default_server;

[&] dans la chaîne de remplacement désigne tout le texte correspondant au motif : vous pouvez ainsi ajouter # devant la partie trouvée pour transformer la ligne en commentaire.

sed -n 's/server_name .*;/# &/p' example.conf
    # server_name example.com www.example.com;

🔲 Options de la commande sed

📌 Options principales : résultats de cet article

OptionRôleRésultat dans cet article
-nDésactive l'affichage automatique et n'affiche que les lignes sélectionnées par psed -n '23p' n'affiche que la ligne 23 ; sans -n, 2p affiche la ligne 2 deux fois
-iEnregistre le résultat dans le fichier d'origine au lieu de l'écran (le texte collé juste après s'ajoute à la fin du nom de sauvegarde)-i.bak crée wp-config.php.bak ; le numéro d'inode change après l'exécution
-eEnchaîne plusieurs scripts et les exécute en une foisDB_USER et DB_PASSWORD changent en une fois ; collés en -ie, une sauvegarde wp-config.phpe apparaît
-EUtilise les expressions régulières étendues (sans barre oblique inverse sur les parenthèses et +)Affiche listen 80 default_server; ; le même script sans -E donne l'erreur [invalid reference]
--follow-symlinksAvec -i, modifie le fichier d'origine vers lequel pointe le lienSans elle, un fichier normal prend la place du lien et l'original ne change pas ; avec elle, la valeur d'origine change

📎 Autres options : selon le manuel officiel

OptionRôle
-fLit le script depuis un fichier et l'exécute
-rExpressions régulières étendues comme -E (-E est plus portable)
-sTraite chaque fichier séparément au lieu d'un flux continu
-zSépare les lignes par le caractère nul au lieu du saut de ligne
-uLit l'entrée par petites quantités et vide la sortie plus souvent
--posixDésactive toutes les extensions GNU
--debugAffiche le déroulement de l'exécution sous forme détaillée

🔲 Simulateur de la commande sed

Le dossier de travail du simulateur ci-dessous contient une copie de wp-config.php et example.conf. Vous pouvez saisir vous-même les commandes vues jusqu'ici et vérifier les fichiers modifiés par -i avec ls -l et diff.

Simulateur de la commande sedGNU sed
[root@server work]#
Les touches ↑↓ rappellent les commandes saisies auparavant.

🔢 FAQ & contenus recommandés

wp-config-sample.php de WordPress a des fins de ligne CRLF : un [\r] invisible se trouve donc juste avant chaque fin de ligne. [/false );$/] n'a affiché aucune ligne, et sur une copie dont [\r] a été retiré avec [s/\r$//], le même motif a trouvé la ligne WP_DEBUG.

-i crée un nouveau fichier normal à la place du lien et y enregistre le résultat : l'original visé par le lien n'a donc pas changé. Pour modifier le fichier d'origine, indiquez aussi [--follow-symlinks]. Dans ce cas, le lien est resté et la valeur d'origine a changé.

Même une variable définie avec NEW=wp_user n'est pas développée par le shell entre guillemets simples, et [$NEW] entre tel quel. Avec le script entre guillemets doubles, le shell a d'abord développé la variable, et wp_user a pris la place de [$NEW].

🧭 Articles recommandés sur les commandes de texte 9 articles · 2 références
🗂️ Commandes d'affichage et d'édition de texte
📄 Commande grep 📄 Commande sort 📄 Commande uniq 📄 Commande tee 📄 Commande sed
📄 Commande cat 📄 Commande less 📄 Commandes head et tail 📄 Commandes vi et vim

ℹ️ Mention d'affiliation
Le contenu de ce site contient des liens d'affiliation. Lorsqu'un visiteur achète un produit ou un service via l'un de ces liens, le site perçoit une commission du vendeur. Le montant payé par l'acheteur(il baisse lors des promotions ↓), lui, n'augmente pas. Les prix, remises et stocks indiqués correspondent à la date de rédaction et peuvent différer ; vérifiez-les donc auprès du vendeur avant d'acheter. Les produits sont choisis et évalués selon nos propres critères, et les commissions n'influencent ni l'ordre de présentation ni le contenu des évaluations.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Prouvez que vous êtes humain : 10   +   5   =