49 votes

La meilleure façon de faire une recherche / remplacement dans plusieurs fichiers?

quelle est la meilleure façon de procéder? Je ne suis pas un guerrier en ligne de commande, mais je pensais qu'il y avait peut-être un moyen d'utiliser grep et cat.

je veux juste remplacer une chaîne qui se produit dans un dossier et des sous-dossiers. quelle est la meilleure façon de procéder? je lance Ubuntu si cela compte.

-ré

42voto

Paul Tomblin Points 83687
find . -type f -print0 | xargs -0 -n 1 sed -i -e 's/from/to/g'

La première partie est une commande rechercher pour trouver les fichiers que vous souhaitez modifier. Vous devrez peut-être modifier que de façon appropriée. Le "xargs" commande prend chaque fichier de la trouver trouve et applique le "sed" commande pour elle. Le "sed" commande prend chaque instance de "de" et le remplace par "de". C'est une norme d'expression régulière, afin de le modifier comme vous en avez besoin.

Si vous utilisez svn, méfiez-vous. Votre .svn-répertoires de recherche et remplacé. Vous devez exclure ceux, par exemple, comme ceci:

find . ! -regex ".*[/]\.svn[/]?.*" -type f -print0 | xargs -0 -n 1 sed -i -e 's/from/to/g'

37voto

Emil Sit Points 11326

Comme Paul l'a dit, vous voulez d'abord trouver les fichiers que vous souhaitez modifier, puis modifier. Une alternative à l'aide de la recherche est d'utiliser GNU grep (la valeur par défaut sur Ubuntu), par ex.:

grep -r -l from . | xargs -0 -n 1 sed -i -e 's/from/to/g'

Vous pouvez également utiliser ack-grep (sudo apt-get install ack-grep ou visiter http://petdance.com/ack/) ainsi, si vous savez que vous voulez seulement un certain type de fichier, et que vous voulez ignorer les choses dans le contrôle de version des répertoires. par exemple, si vous ne souhaitez que des fichiers texte,

ack -l --print0 --text from | xargs -0 -n 1 sed -i -e 's/from/to/g'
# `from` here is an arbitrary commonly occurring keyword

Une alternative à l'utilisation de sed est d'utiliser perl qui peut traiter plusieurs fichiers par commande, par exemple,

grep -r -l from . | xargs perl -pi.bak -e 's/from/to/g'

Ici, perl est dit de modifier, de faire un .bak fichier en premier.

Vous pouvez combiner la gauche de la pipe avec le côté droit, selon votre préférence.

3voto

Une alternative à sed utilise rpl (par exemple disponible sur http://rpl.sourceforge.net/ ou votre distribution GNU / Linux), comme rpl --recursive --verbose --whole-words 'F' 'A' grades/

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