2017-09-27 1 views
0

Je suis conscient de la simple recherche et remplacer les commandes (:%s/apple/orange/g) dans vim où nous trouvons tous les «pommes» et les remplacer par «orange».vim: Trouver un motif, sauter un mot et ajouter quelque chose dans toutes les lignes correspondantes

Mais est-il possible de faire quelque chose comme ça dans vim? Trouver tout le mot «Blé» dans un fichier et ajouter «stocker» après avoir omis le mot suivant (le cas échéant)?

Exemple: contenu du fichier original:

Wheat flour 
Wheat bread 
Rice flour 
Wheat 

Après recherche et de remplacement:

Wheat flour store 
Wheat bread store 
Rice flour 
Wheat store 

Répondre

5
Ce

est le moment idéal pour utiliser la commande global. Il va appliquer une commande à chaque ligne qui correspond à une regex donnée.

     *:g* *:global* *E147* *E148* 
:[range]g[lobal]/{pattern}/[cmd] 
      Execute the Ex command [cmd] (default ":p") on the 
      lines within [range] where {pattern} matches. 

Dans ce cas, la commande est norm A store et l'expression rationnelle est wheat. Donc, mettre tous ensemble, nous avons

:g/Wheat/norm A store 

Maintenant, vous pourrait faire avec la commande de substitution, mais je trouve globale est beaucoup plus pratique et facile à lire. Dans ce cas, vous auriez:

:%s/Wheat.*/& store 

Ce qui signifie:

:%s/    " On every line, replace... 
    Wheat   " Wheat 
     .*   " Followed by anything 
     /  " with... 
      &  " The entire line we matched 
       store " Followed by 'store'