Table des matières

Remplacer terxtes dans fichiers

Question

linux ligne de commande pour remplaer un mot par un autreModifierVoici plusieurs méthodes pour remplacer un mot par un autre en ligne de commande Linux :

Réponse 1

Voici plusieurs méthodes pour remplacer un mot par un autre en ligne de commande Linux :
Avec sed (le plus courant)

Pour remplacer dans un fichier et afficher le résultat :
bash

sed 's/ancien_mot/nouveau_mot/g' fichier.txt

Pour modifier le fichier directement :
bash

sed -i 's/ancien_mot/nouveau_mot/g' fichier.txt

Pour remplacer seulement la première occurrence par ligne :
bash

sed 's/ancien_mot/nouveau_mot/' fichier.txt

Avec grep et sed combinés

Pour chercher et remplacer dans plusieurs fichiers :
bash

grep -l “ancien_mot” *.txt | xargs sed -i 's/ancien_mot/nouveau_mot/g'

Avec find pour une recherche récursive

Pour remplacer dans tous les fichiers d'un répertoire et ses sous-répertoires :
bash

find . -type f -name “*.txt” -exec sed -i 's/ancien_mot/nouveau_mot/g' {} +

Exemples pratiques

Remplacer “hello” par “bonjour” dans un fichier :
bash

sed -i 's/hello/bonjour/g' monfichier.txt

Remplacer avec des caractères spéciaux (utiliser un autre délimiteur) :

bash

sed -i 's|/ancien/chemin|/nouveau/chemin|g' fichier.txt

Faire une sauvegarde avant modification :
bash

sed -i.bak 's/ancien_mot/nouveau_mot/g' fichier.txt

L'option -i modifie le fichier directement, g remplace toutes les occurrences sur chaque ligne, et vous pouvez ajouter .bak pour créer une sauvegarde automatique.

Réponse

find . -type f -name “*.txt” -exec sed -i 's/ancien_mot/nouveau_mot/g' {} + explication du code
Modifier

Voici l'explication détaillée de cette commande :
Décomposition de la commande
bash

find . -type f -name “*.txt” -exec sed -i 's/ancien_mot/nouveau_mot/g' {} +

find .

  find : commande pour rechercher des fichiers et dossiers
  . : commence la recherche dans le répertoire courant (point = répertoire actuel)

-type f

  1. type f : filtre pour ne chercher que les fichiers (pas les dossiers)

f = file (fichier), d = directory (dossier)

-name “*.txt”

  1. name : filtre par nom de fichier

“*.txt” : motif qui correspond à tous les fichiers se terminant par .txt

  L'astérisque * est un joker qui remplace n'importe quelle séquence de caractères

-exec

  1. exec : exécute une commande sur chaque fichier trouvé

Tout ce qui suit -exec jusqu'à {} ou + est la commande à exécuter

sed -i 's/ancien_mot/nouveau_mot/g'

  sed : éditeur de flux pour modifier du texte
  -i : modifie le fichier directement (in-place)
  's/ancien_mot/nouveau_mot/g' :
      s = substitution
      /ancien_mot/ = texte à chercher
      /nouveau_mot/ = texte de remplacement
      g = global (remplace toutes les occurrences sur chaque ligne)

{}

  {} : placeholder qui sera remplacé par le nom de chaque fichier trouvé
  find remplace {} par le chemin complet de chaque fichier

+

  + : termine la commande -exec et optimise l'exécution
  Groupe plusieurs fichiers ensemble pour une exécution plus efficace
  Alternative à \; qui exécuterait sed une fois par fichier

Exemple concret

Si vous avez cette structure :

./doc1.txt
./dossier/doc2.txt
./autre/doc3.txt

La commande va :

  Trouver tous les fichiers .txt
  Exécuter sed -i 's/ancien_mot/nouveau_mot/g' sur chacun
  Remplacer tous les "ancien_mot" par "nouveau_mot" dans chaque fichier

C'est l'équivalent d'exécuter :
bash

sed -i 's/ancien_mot/nouveau_mot/g' ./doc1.txt ./dossier/doc2.txt ./autre/doc3.txt