2011-12-24 4 views
0

Par exemple, j'ai une tâche pour rechercher tous les fichiers dans le répertoire courant où contient "foo", puis remplacer par "bar".
Maintenant, voici ma solution actuelle:
:vim /bar/ **/*
Utilisez cette option pour rechercher toutes les apparences de foo, puis le remplacer un par un « bar »
:s/foo/bar/gc
Il est évident que ce n'est pas une bonne solution quand remplace devient grand . Donc, s'il y a une meilleure solution pour combiner ces deux opérations en une seule. Mais il y a une condition préalable: Doit donner un indice avant le remplacement, tout comme ce que fait le c dans la deuxième commande. Ceci évite de remplacer un mot qui n'a pas besoin d'être remplacé.Comment combiner: vim et: s dans vim

Répondre

0

le plus simple serait:

vim $(egrep -l '/foo/' **/*) -c 'bufdo %s/foo/bar/g' 

mais cela échouera s'il y a des espaces sur les noms de fichiers, une approche plus robuste serait:

files=() 
while IFS= read -rd '' filename; do 
    files+=("$filename") 
done < <(egrep -Zl '/foo/' **/*) 
vim "${files[@]}" -c 'bufdo %s/foo/bar/g'