140 votes

Rechercher et remplacer dans vim dans des lignes spécifiques

Je peux utiliser

:5,12s/foo/bar/g

pour rechercher foo et le remplacer par bar entre les lignes 5 et 12. Comment puis-je faire cela uniquement dans les lignes 5 et 12 (et non dans les lignes intermédiaires) ?

107voto

Ingo Karkat Points 61399

Vim dispose d'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

73voto

romainl Points 55506

Vous pouvez effectuer la substitution à la ligne 5 et la répéter avec un effort minimal à la ligne 12 :

:5s/foo/bar
:12&

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

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

Voir :help :& et des amis.

24voto

Dean Points 1778

Vous pouvez toujours ajouter un c jusqu'à la fin. Cela demandera une confirmation pour chaque correspondance.

:5,12s/foo/bar/gc

12voto

eckes Points 17277

Question intéressante. Il semble qu'il n'y ait qu'une sélection de plages 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 la fonction :g opérateur. Si votre fichier ressemble à ceci (les chiffres sont donnés à titre indicatif) :

 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 remplacer one por eno sur les lignes où il y a enil au lieu de line :

:g/enil/s/one/eno/

2voto

suspectus Points 5877

Vous pourriez 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 (utilisant un document ici qui traite les entrées jusqu'au marqueur EndCommand), cela ressemblerait à ceci :

ed file <<EndCommands
    5
    s/foo/bar/g
    7
    s/foo/bar/g
    wq
EndCommands

Bien entendu, les commandes ed peuvent également être utilisées sur la ligne de commande.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X