681 votes

Comment remplacer une chaîne de caractères dans plusieurs fichiers en ligne de commande linux ?

Je dois remplacer une chaîne de caractères dans de nombreux fichiers d'un dossier, avec seulement ssh l'accès au serveur. Comment puis-je m'y prendre ?

851voto

kev Points 41855
cd /path/to/your/folder
sed -i 's/foo/bar/g' *

Les occurrences de "foo" seront remplacées par "bar".

Sur les systèmes BSD comme macOS, vous devez fournir une extension de sauvegarde comme -i '.bak' ou sinon "risque de corruption ou de contenu partiel" selon la page de manuel.

cd /path/to/your/folder
sed -i '.bak' 's/foo/bar/g' *

303voto

Céline Aussourd Points 562

Similaire à la réponse de Kaspar mais avec le drapeau g pour remplacer toutes les occurrences sur une ligne.

find ./ -type f -exec sed -i 's/string1/string2/g' {} \;

Pour une insensibilité globale à la casse :

find ./ -type f -exec sed -i 's/string1/string2/gI' {} \;

286voto

pymarco Points 360

La réponse de @kev est bonne, mais n'affecte que les fichiers du répertoire immédiat.l'exemple ci-dessous utilise grep pour trouver les fichiers de manière récursive. Cela fonctionne pour moi à chaque fois.

grep -rli 'old-word' * | xargs -i@ sed -i 's/old-word/new-word/g' @

Répartition des commandes

grep -r : -récursif , lire récursivement tous les fichiers sous chaque répertoire.
grep -l : --print-with-matches affiche le nom de chaque fichier qui a une correspondance, au lieu d'afficher les lignes correspondantes.
grep -i : --ignore-case .

xargs pour transformer le STDIN en arguments, suivez cette procédure respuesta .
xargs -i@ ~command contient @~ : un caractère de remplacement pour l'argument à utiliser dans une position spécifique dans le fichier ~Commande. le signe @ est un caractère de remplacement qui peut être remplacé par n'importe quelle chaîne de caractères.

sed -i : modifier les fichiers en place, sans sauvegardes.
sed s/regexp/replacement/ : correspondance de chaînes de substitution regexp con remplacement .
sed s/regexp/replacement/ g : mondial Dans ce cas, la substitution s'effectue pour chaque correspondance et non pas seulement pour la première.

49voto

Cela a marché pour moi :

find ./ -type f -exec sed -i 's/string1/string2/' {} \;

Howerver, ce n'est pas le cas : sed -i 's/string1/string2/g' * . Peut-être que "foo" n'était pas censé être la chaîne 1 et "bar" pas la chaîne 2.

38voto

Djacomo Points 31

Pour remplacer une chaîne dans plusieurs fichiers, vous pouvez utiliser :

grep -rl string1 somedir/ | xargs sed -i 's/string1/string2/g'

Par exemple

grep -rl 'windows' ./ | xargs sed -i 's/windows/linux/g'

Blog source

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X