Pouvez-vous éditer en masse tous les fichiers retournés dans un grep?

Je veux éditer en masse une tonne de fichiers renvoyés dans un grep. (Je sais, je devrais aller mieux à sed).

Donc si je fais:

grep -rnI 'xg_icon-*' 

Comment puis-je transférer tous ces fichiers dans vi?

La méthode la plus simple consiste à faire en sorte que grep renvoie uniquement les noms de fichiers ( -l au lieu de -n ) correspondant au modèle. Exécutez cela dans un sous-shell et transmettez les résultats à Vim.

 vim $(grep -rIl 'xg_icon-*' *) 

Une bonne solution générale consiste à utiliser xargs pour convertir une sortie standard d’un processus comme grep en une liste d’arguments.

À la:

 grep -rIl 'xg_icon-*' | xargs vi 

Si vous utilisez vim et l’option -p, chaque fichier sera ouvert dans un onglet et vous pourrez basculer entre eux en utilisant gt ou gT, ou même la souris si vous avez le support de la souris dans le terminal.

Vous pouvez le faire sans aucun traitement de la sortie de grep! Cela vous permettra même d’aller sur la bonne ligne (en utilisant les commandes :help quickfix , par exemple :cn ou :cw ). Donc, si vous utilisez bash ou zsh:

 vim -q <(grep foo * .c)

Si ce que vous voulez éditer est similaire dans tous les fichiers, alors il est inutile d’utiliser vi pour le faire manuellement. (bien que vi puisse aussi être scripté), hypothétiquement, cela ressemble à ceci, puisque vous ne mentionnez jamais ce que vous voulez éditer

 grep -rnI 'xg_icon-*' | while read FILE do sed -i.bak 's/old/new/g' $FILE # (or other editing commands, eg awk... ) done 
 vi `grep -l -i findthisword *`