Aller au contenu
English
Compte : non connecté, synchronisation possible Mon apprentissage
Selectionner le thème
English

Rechercher et remplacer dans un fichier

Par mis à jour le

Améliorer cette page

Un port à changer dans une configuration Nginx, une adresse IP à mettre à jour dans dix fichiers, un nom d'hôte à corriger après un renommage de serveur, ces opérations reviennent constamment en administration Linux. Savoir les faire vite, sans erreur et sans ouvrir un éditeur graphique, fait partie des compétences de base d'un administrateur.

Ce guide couvre les trois approches principales : le remplacement non-interactif avec sed (le plus courant en administration), le remplacement interactif dans un éditeur (nano, vi, vim), et le remplacement multi-fichiers en combinant find et sed.

  • Remplacer un mot ou un motif dans un fichier avec sed
  • Vérifier un remplacement avant de l'appliquer
  • Rechercher et remplacer dans nano, vi et vim
  • Appliquer un remplacement sur plusieurs fichiers à la fois
  • Choisir le bon outil selon la situation

Avant de détailler chaque méthode, voici la règle de décision rapide :

SituationOutil recommandéPourquoi
Remplacement rapide dans un fichier de configsedUne seule commande, pas d'éditeur à ouvrir
Remplacement dans un script ou un pipelinesedNon-interactif, scriptable
Remplacement avec vérification visuelle ligne par lignevim (:s/.../gc)Confirmation avant chaque remplacement
Édition ponctuelle d'un fichier simplenanoLe plus accessible pour un débutant
Remplacement massif dans 10+ fichiersfind + sedAutomatisé, pas d'intervention manuelle
Fichier volumineux avec contexte à comprendrevim ou viNavigation et recherche intégrées

sed (stream editor) est l'outil de référence pour modifier du texte en ligne de commande. Il lit un fichier ligne par ligne, applique une transformation et écrit le résultat. Vous ne quittez jamais votre terminal.

Fenêtre de terminal
sed 's/ancien/nouveau/' fichier

Cette commande remplace la première occurrence de ancien par nouveau sur chaque ligne, et affiche le résultat sur la sortie standard. Le fichier original n'est pas modifié.

Pour remplacer toutes les occurrences sur chaque ligne, ajoutez le drapeau g (global) :

Fenêtre de terminal
sed 's/ancien/nouveau/g' fichier

La bonne pratique consiste à toujours vérifier le résultat avant de toucher au fichier. sed affiche le résultat par défaut sans modifier le fichier, profitez-en.

  1. Voir ce qui va changer :

    Fenêtre de terminal
    sed 's/8080/8443/g' /etc/nginx/sites-available/default

    Le fichier entier s'affiche avec les remplacements appliqués. Comparez visuellement.

  2. Cibler les lignes concernées :

    Fenêtre de terminal
    grep -n '8080' /etc/nginx/sites-available/default

    Vous voyez les numéros de lignes contenant le motif, utile pour vérifier qu'il n'y a pas de remplacement indésirable.

  3. Appliquer la modification :

    Fenêtre de terminal
    sed -i 's/8080/8443/g' /etc/nginx/sites-available/default

    L'option -i (in-place) modifie le fichier directement.

Changer un port :

Fenêtre de terminal
sed -i 's/^Listen 80$/Listen 8080/' /etc/apache2/ports.conf

Le motif est ancré : ^ pour le début de ligne, $ pour la fin. Sans ces ancres, s/Listen 80/…/ modifierait aussi une ligne Listen 8080. Et le port visé doit être libre : le ports.conf de Debian déclare déjà Listen 443 pour le module SSL, et y changer Listen 80 en Listen 443 fait refuser la configuration par Apache (Cannot define multiple Listeners on the same IP:port). Validez toujours avec sudo apache2ctl configtest avant de recharger.

Remplacer une adresse IP :

Fenêtre de terminal
sed -i 's/\b192\.168\.1\.10\b/192.168.1.20/g' /etc/hosts

Les points échappés (\.) ne correspondent qu'à un point, et les bornes \b empêchent de toucher une adresse plus longue. Sans elles, la ligne 192.168.1.100 db deviendrait 192.168.1.200 db : c'est le piège de l'adresse qui en contient une autre.

Modifier un paramètre de configuration :

Fenêtre de terminal
sed -i 's/^#PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config

Cette dernière commande décommente et modifie la ligne en une seule opération. Le ^# signifie "commence par #" et .* correspond au reste de la ligne. Sur Debian et Ubuntu, sshd_config inclut d'abord les fichiers de /etc/ssh/sshd_config.d/, et la première valeur lue l'emporte : vérifiez la valeur réellement appliquée avec sudo sshd -T | grep -i permitrootlogin.

Quand le texte contient des / (chemins de fichiers par exemple), utilisez un autre délimiteur pour éviter les échappements illisibles :

Fenêtre de terminal
# Difficile à lire
sed -i 's/\/usr\/local\/bin/\/opt\/bin/g' script.sh
# Lisible : utilisez | ou # comme délimiteur
sed -i 's|/usr/local/bin|/opt/bin|g' script.sh

Vous pouvez limiter le remplacement à une plage de lignes ou à un motif :

Fenêtre de terminal
# Lignes 10 à 20 seulement
sed -i '10,20s/ancien/nouveau/g' fichier.conf
# Uniquement les lignes contenant "server"
sed -i '/server/s/8080/8443/g' nginx.conf

Dans nano, le raccourci Ctrl+\ lance la fonction rechercher/remplacer :

  1. Ouvrez le fichier :

    Fenêtre de terminal
    nano /etc/hosts
  2. Appuyez sur Ctrl+\

  3. Tapez le texte à chercher, puis Entrée

  4. Tapez le texte de remplacement, puis Entrée

  5. Pour chaque occurrence, nano vous demande : Y (remplacer), N (ignorer), A (tout remplacer)

Quand utiliser nano : fichier simple, modification ponctuelle, vous voulez voir ce que vous faites à chaque étape. Détails complets dans le guide Nano.

Dans vi ou vim, le remplacement se fait depuis le mode commande :

:%s/ancien/nouveau/g # Tout le fichier, toutes les occurrences
:%s/ancien/nouveau/gc # Avec confirmation pour chaque occurrence
:10,20s/ancien/nouveau/g # Lignes 10 à 20 seulement

Le % signifie "tout le fichier". Le drapeau c (confirm) vous montre chaque occurrence et attend votre réponse :

  • y, remplacer
  • n, ignorer
  • a, tout remplacer (sans plus demander)
  • q, arrêter

Pour chercher sans remplacer, tapez /motif en mode normal, puis n pour l'occurrence suivante.

Quand utiliser vim : fichier complexe, besoin de contexte visuel, remplacement sélectif avec confirmation. Détails complets dans le guide Vi et le guide Vim.

Pour appliquer un remplacement dans tous les fichiers d'un répertoire :

Fenêtre de terminal
find /etc/nginx/ -name '*.conf' -exec sed -i 's/8080/8443/g' {} +

Cette commande :

  1. trouve tous les fichiers .conf dans /etc/nginx/
  2. applique le remplacement sed sur chacun

Variante qui cible uniquement les fichiers contenant le motif :

Fenêtre de terminal
grep -rlZ 'ancien-hostname' /etc/ | xargs -0 sed -i 's/ancien-hostname/nouveau-hostname/g'

grep -rl liste les fichiers contenant le motif (récursivement, noms uniquement), et xargs passe chaque fichier à sed. Le couple -Z / -0 sépare les noms par un caractère nul : sans lui, un fichier nommé a b.conf est coupé en deux noms, et sed répond can't read.

  1. Créez un fichier de test :

    Fenêtre de terminal
    cat > /tmp/test-config.conf << 'EOF'
    server {
    listen 8080;
    server_name old-server.example.com;
    root /var/www/old-server;
    }
    EOF
  2. Vérifiez le contenu :

    Fenêtre de terminal
    cat /tmp/test-config.conf
  3. Remplacez le port avec sed (sans modifier le fichier) :

    Fenêtre de terminal
    sed 's/8080/443/' /tmp/test-config.conf

    Vérifiez que la ligne listen affiche bien 443.

  4. Remplacez le nom d'hôte (en modifiant le fichier) :

    Fenêtre de terminal
    sed -i 's/old-server/new-server/g' /tmp/test-config.conf
    cat /tmp/test-config.conf

    Les deux occurrences de old-server doivent avoir été remplacées.

  5. Ouvrez dans vim et remplacez avec confirmation :

    Fenêtre de terminal
    vim /tmp/test-config.conf

    Tapez :%s/new-server/prod-server/gc puis validez chaque occurrence avec y.

SymptômeCause probableSolution
sed ne remplace rienLe motif ne correspond pas exactement (casse, espaces)Vérifier avec grep d'abord (grep -i ignore la casse), puis ajouter le drapeau I à sed : s/ancien/nouveau/gI
Remplacement partiel (première occurrence seulement)Drapeau g manquantUtiliser s/ancien/nouveau/g
sed: -e expression #1, char X: unknown option to 's'Le texte contient le délimiteur /Utiliser un délimiteur alternatif : s|ancien|nouveau|g
Fichier modifié par erreur avec -iPas de sauvegarde préalableRestaurer depuis .bak si sed -i.bak a été utilisé, sinon depuis un backup système
Permission denied sur un fichier dans /etc/Droits insuffisantsUtiliser sudo sed -i ...
Remplacement dans vim n'atteint pas toutes les lignesPortée limitée (:s sans %)Utiliser :%s/ancien/nouveau/g pour tout le fichier
Caractères spéciaux dans le motif (., *, [)Interprétés comme des expressions régulièresÉchapper avec \ : sed 's/192\.168\.1\.10/192.168.1.20/g'
  • sed -i 's/ancien/nouveau/g' fichier est la commande de remplacement la plus utilisée en administration Linux.
  • Toujours vérifier avant d'utiliser -i : lancez sed sans -i ou utilisez grep -n pour voir les lignes concernées.
  • sed -i.bak crée automatiquement une copie de sauvegarde, à privilégier sur les fichiers critiques.
  • Nano (Ctrl+\) pour les remplacements ponctuels visuels.
  • Vim (:%s/.../gc) pour les remplacements avec confirmation ligne par ligne.
  • find + sed ou grep -rlZ + xargs -0 sed pour le remplacement en masse dans plusieurs fichiers.
  • Les points (.) dans les adresses IP sont des caractères spéciaux regex, échappez-les avec \.

Vérifiez que l'essentiel de ce guide est acquis. Les questions portent uniquement sur ce qui vient d'être expliqué ici.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

6 questions
6 min.
70% requis

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

Ce projet vous est utile ?

Les guides, formations, quiz et labs restent gratuits. Si vous les utilisez régulièrement, vous pouvez contribuer à leur maintenance et à leur développement.

Devenir membre de soutien (nouvel onglet) Soutenir une fois (nouvel onglet) En savoir plus

Suivez aussi le projet sur LinkedIn