====== 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