Comment rechercher et remplacer plusieurs fichiers dans Vim

Dans cet article, vous apprendrez comment rechercher et remplacer de manière interactive dans de nombreux fichiers avec seulement deux commandes, grâce à Vim.

Bien qu'il existe une multitude de méthodes pour rechercher et remplacer des mots dans un seul fichier, que faites-vous lorsque vous avez une chaîne à mettre à jour sur plusieurs fichiers non liés, tous avec des noms différents? Vous exploitez la puissance des outils de ligne de commande, bien sûr!

Tout d'abord, vous aurez besoin de findtous les fichiers que vous souhaitez modifier. L'enchaînement de ce qui est effectivement des requêtes de recherche findn'est vraiment limité que par votre imagination.

Voici un exemple simple qui trouve des fichiers Python:

find . -name '*.py' 

Le -nametest recherche un modèle, tel que tous les fichiers se terminant par .py. Mais findpeut faire beaucoup plus avec d'autres conditions de test, y compris des -regextests. Courez find --helppour voir la multitude d'options.

Affinez votre recherche en utilisant greppour obtenir uniquement les fichiers contenant la chaîne que vous souhaitez modifier, par exemple en ajoutant:

grep -le '\' 

L' -loption ne vous donne que les noms de fichiers pour tous les fichiers contenant un motif (indiqué par -e) qui correspond à «une baleine».

Vous pouvez également utiliser l'impressionnant de Vim :bufdoqui vous permet d'exécuter la même commande sur plusieurs tampons. Il fonctionne de manière interactive avec tous ces fichiers sans s'ennuyer à ouvrir, enregistrer et fermer chaque fichier, un à la fois.

Branchez vos puissants find+ greprésultats dans Vim avec:

vim `find . -name '*.py' \ -exec grep -le '\' {} \;` 

L'utilisation de backtick-expansion pour transmettre notre recherche à Vim ouvre plusieurs tampons prêts à l'emploi. (Faites :h backtick-expansiondans Vim pour plus.)

Vous pouvez maintenant appliquer la commande Vim :bufdoà tous ces fichiers et effectuer des actions telles que la recherche et le remplacement interactifs:

:bufdo %s/a whale/a bowl of petunias/gce 

Le gpour «global» changera les occurrences du motif sur toutes les lignes. Le esupprime les erreurs si le modèle n'est pas trouvé. L' coption rend cela interactif. Si vous vous sentez confiant, vous pouvez l'omettre pour apporter les modifications sans les revoir.

Lorsque vous avez terminé de parcourir tous les tampons, enregistrez tout le travail que vous avez terminé avec:

:bufdo wq! 

Puis profitez de la gloire de votre temps et de vos efforts gagnés.