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

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

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

-name “*.txt”

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

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