Rechercher et remplacer in vim dans des lignes spécifiques

je peux utiliser

:5,12s/foo/bar/g 

pour rechercher foo et le remplacer par des bar entre les lignes 5 et 12. Comment puis-je faire cela uniquement à la ligne 5 et 12 (et non dans les lignes entre)?

Vim possède des atomes d’expression régulière spéciaux qui correspondent à certaines lignes, colonnes, etc. vous pouvez les utiliser (éventuellement en plus de la plage) pour limiter les correspondances:

 :5,12s/\(\%5l\|\%12l\)foo/bar/g 

Voir :help /\%l

Vous pouvez faire la substitution sur la ligne 5 et la répéter avec un minimum d’effort sur la ligne 12:

 :5s/foo/bar :12& 

Comme souligné par Ingo,: :& oublie vos drapeaux. Puisque vous utilisez /g , la commande correcte serait :&& :

 :5s/foo/bar/g :12&& 

Voir :help :& et amis.

Vous pouvez toujours append un c à la fin. Cela demandera une confirmation pour chaque match.

 :5,12s/foo/bar/gc 

Question interessante. On dirait qu’il n’y a que la sélection de gamme et pas de sélection de lignes multiples:

http://vim.wikia.com/wiki/Ranges

Cependant, si vous avez quelque chose de spécial sur les lignes 5 et 12, vous pouvez utiliser l’opérateur :g . Si votre fichier ressemble à ceci (chiffres uniquement pour référence):

  1 line one 2 line one 3 line one 4 line one 5 enil one 6 line one 7 line one 8 line one 9 line one 10 line one 11 line one 12 enil one 

Et vous voulez en remplacer one par eno sur les lignes où il y a enil au lieu de line :

 :g/enil/s/one/eno/ 

Vous pouvez utiliser ed – un éditeur de texte orienté ligne avec des commandes similaires à vi et vim. Il est probablement antérieur à vi et vim.

Dans un script (en utilisant un document ici qui traite l’entrée jusqu’au marqueur EndCommand), cela ressemblerait à ceci:

 ed file < 

De toute évidence, les commandes ed peuvent également être utilisées sur la ligne de commande.