web-dev-qa-db-fra.com

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?

36
Vijay

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

find . -name '*.html' |xargs Perl -pi -e 's/find/replace/g'
47
Vijay

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 foo dans vos fichiers Python sous le répertoire actuel par et créez une sauvegarde pour chaque fichier avec l'extension . py.bak .

Et pour supprimer les fichiers de .bak:

find . -name "*.bak" -delete
25
Stan

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

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

La commande ex n'est que le mode: ligne de vi.

6
DigitalRoss

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'
5
XavierCLL

avec le 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 
2
ghostdog74