web-dev-qa-db-fra.com

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

Je veux éditer en masse une tonne de fichiers qui sont retournés dans un grep. (Je sais, je devrais devenir meilleur à sed).

Donc si je le fais:

grep -rnI 'xg_icon-*'

Comment puis-je diriger tous ces fichiers dans vi?

49
mager

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

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

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

À la:

grep -rIl 'xg_icon-*' | xargs vi
21
Benj

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 un support de souris dans le terminal.

7
user210574

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

 vim -q & lt (grep foo * .c) 
6
Jaen

si ce que vous voulez éditer est similaire pour tous les fichiers, inutile d'utiliser vi pour le faire manuellement. (bien que vi puisse aussi être scripté), hypothétiquement, ça ressemble à ça, 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
1
ghostdog74
vi `grep -l -i findthisword *`
1
Mookayama