36 votes

rechercher et remplacer dans plusieurs fichiers en ligne de commande

Comment trouver et remplacer une chaîne en ligne de commande dans plusieurs fichiers sous Unix?

46voto

Vijay Points 17992

il existe de nombreuses façons. Mais l'une des réponses serait:

 find . -name '*.html' |xargs perl -pi -e 's/find/replace/g'
 

25voto

Stan Points 2550

Comme la solution Zombie (et plus rapide je suppose) mais avec sed (standard sur de nombreuses distributions et OSX) au lieu de Perl:

 find . -name '*.py' | xargs sed -i .bak 's/foo/bar/g'
 

Cela remplacera toutes les occurrences de foo dans vos fichiers Python sous le répertoire actuel avec barre et créera une sauvegarde pour chaque fichier avec l'extension .py.bak .

Pour nettoyer la sauvegarde, exécutez:

 find . -name "*.bak" -exec rm {} \;
 

Attention, le dernier supprime tous les fichiers .bak.

6voto

DigitalRoss Points 80400

J'ai toujours fait ça avec des scripts ed ou ex scripts .

 for i in "$@"; do ex - "$i" << 'eof'; done
%s/old/new/
x
eof
 

La commande ex est juste le mode: ligne de vi.

4voto

epsilom Points 75

Utiliser find et sed avec un nom ou des répertoires avec de l'espace utilisez ceci:

 find . -name '*.py' -print0 | xargs -0 sed -i 's/foo/bar/g'
 

2voto

ghostdog74 Points 86060

avec un shell bash récent, et en supposant que vous n'avez pas besoin de parcourir les répertoires

 for file in *.txt
do
while read -r line
do
    echo ${line//find/replace} > temp        
done <"file"
mv temp "$file"
done
 

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