Commande sed : remplacement de chaînes, suppression de lignes et option -i
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/blogPour 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/blogSi 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_USERdefine( '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.phpdefine( '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.phpdefine( '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.phpdefine( '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.phpdefine( '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.php32sed -n '$=' wp-config.php102Une 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.phpdefine( '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 WordPressCette 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.
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.confserver {
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.confserver {
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.phpsed -i.bak 's/database_name_here/wordpress_db/' wp-config.phpAvec -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.bakLe 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.php23c23
< 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.phpgrep -n -e DB_USER -e DB_PASSWORD wp-config.php26: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.phpls 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.php207618887 wp-config.phpsed -i 's/localhost/127.0.0.1/' wp-config.phpls -i wp-config.php207618883 wp-config.phpLe 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.phpsed: can't read no-such.php: No such file or directorysed -i 's/x/y/'sed: no input files5️⃣ 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.orgPour chercher un point littéral, placez une barre oblique inverse devant.
echo 'exampleXcom example.com' | sed 's/example\.com/test.org/g'exampleXcom test.orgUne 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.confsed: -e expression #1, char 46: invalid reference \1 on `s' command's RHSsed -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
| Option | Rôle | Résultat dans cet article | |
|---|---|---|---|
| -n | Désactive l'affichage automatique et n'affiche que les lignes sélectionnées par p | sed -n '23p' n'affiche que la ligne 23 ; sans -n, 2p affiche la ligne 2 deux fois | |
| -i | Enregistre 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 | |
| -e | Enchaîne plusieurs scripts et les exécute en une fois | DB_USER et DB_PASSWORD changent en une fois ; collés en -ie, une sauvegarde wp-config.phpe apparaît | |
| -E | Utilise 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-symlinks | Avec -i, modifie le fichier d'origine vers lequel pointe le lien | Sans 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
| Option | Rôle | |
|---|---|---|
| -f | Lit le script depuis un fichier et l'exécute | |
| -r | Expressions régulières étendues comme -E (-E est plus portable) | |
| -s | Traite chaque fichier séparément au lieu d'un flux continu | |
| -z | Sépare les lignes par le caractère nul au lieu du saut de ligne | |
| -u | Lit l'entrée par petites quantités et vide la sortie plus souvent | |
| --posix | Désactive toutes les extensions GNU | |
| --debug | Affiche 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.
🔢 FAQ & contenus recommandés







ℹ️ 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.