Recherche interactive / remplacer l'expression régulière dans Vim?


266

Je connais le regex pour faire un remplacement global,

     %s/old/new/g

Comment procédez-vous pour effectuer une recherche-remplacement interactive dans Vim ?

Réponses:


464

Ajoutez l'indicateur c (dans l'invite de commande vim):

:%s/old/new/gc

vous donnera un oui / non à chaque occurrence de «ancien».

"old" est mis en évidence dans le texte;  au bas de la fenêtre, il est écrit "remplacer par un nouveau (y / n / a / q / l / ^ E / ^ y)?)"

L'aide intégrée de Vim offre des informations utiles sur les options disponibles une fois la substitution avec confirmation sélectionnée. Utilisation:

:h :s

Faites ensuite défiler jusqu'à la section sur les options de confirmation. Capture d'écran ci-dessous:

Texte qui dit "[C] Confirmer chaque substitution. [...] CTRL-Y pour faire défiler l'écran vers le bas"

Par exemple, pour remplacer ceci et toutes les correspondances restantes, utilisez a.


30
+1, j'ai appris quelque chose de nouveau aujourd'hui! vim a tellement de secrets cachés .. :)
Marc Novakowski

10
Apprendre les commandes vim, c'est un peu comme jouer à Nethack. Vous ne savez jamais ce que le personnage va faire.
Mark Biek

22
J'imagine que le "c" est pour "confirmer"
matpie

8
Honnêtement, je n'essaie pas de paraître sarcastique, mais tout cela aurait pu être trouvé en faisant ": help: s" qui vous aurait conduit directement à ": help: s_flags".
Jeremy Cantrell

13
@jeremy: cela nécessite de savoir que la commande help existe, et de savoir qu'il faut taper le commutateur "deux points" pour accéder au fichier d'aide correspondant. Comment ou où apprendrait-on cela?
Dennis

79

Mark Biek a souligné en utilisant:

%s/old/new/gc

pour une recherche globale remplacer par confirmation pour chaque substitution. Mais, j'aime aussi vérifier de manière interactive que l'ancien texte correspondra correctement. Je fais d'abord une recherche avec une expression régulière, puis je réutilise ce modèle:

/old.pattern.to.match
%s//replacement/gc

Le s//utilisera le dernier modèle de recherche.


9
L'une des plus grandes choses à propos de l'utilisation / de l'apprentissage de vim est la profondeur du trou du lapin!
ken

2
Bien, je faisais toujours la recherche, puis j'utilisais <Cr> / pour coller la dernière recherche dans la commande de substitution.
Atilla Filiz

Exactement ce qui me manque dans Sublime Text!
Xenofex

Cette réponse est particulièrement utile, car j'imagine souvent que vous décidez de remplacer des instances d'un mot, c'est le mot que vous venez de rechercher.
M_M

20

Je pense que vous recherchez c, par exemple s/abc/123/gc, cela entraînera VIM pour confirmer les remplacements. Voir: aide: remplacer pour plus d'informations.


9

J'utilise généralement la commande find / substitute / next / repeat :-)

/old<CR>3snew<ESC>n.n.n.n.n.n.n.

C'est find "old", substitute 3 characters for "new", find next, repeat substituteet ainsi de suite.

C'est une douleur pour les substitutions massives, mais cela vous permet d'ignorer sélectivement certaines occurrences anciennes (en appuyant simplement à nnouveau pour trouver la suivante au lieu de .répéter une substitution).


Je l'utilise également, même pour des textes similaires. (3cW <texthere> <ESC> <déplacer vers un nouvel emplacement>. <move>. <move>.)
strager

1
Ce n'est pas un contre-modèle! C'est doux. Et vous pouvez rechercher dans la direction opposée en utilisant N. Vraiment bien si vous voyez un mot et que vous voulez le changer. * cwNewText <ESC> Nnn (Cela sautera loin du mot sous le curseur, mais sautera en arrière dès que vous aurez changé l'occurrence suivante.
PEZ

c'est quoi <CR>?
Sother

9

Si vous voulez simplement compter le nombre d'occurrences de «abc», vous pouvez le faire %s/abc//gn. Cela ne remplace rien mais signale simplement le nombre d'occurrences de 'abc'.


3

Si votre texte de remplacement doit changer pour chaque occurrence correspondante (c'est-à-dire ne pas simplement choisir Oui / Non pour appliquer un remplacement singulier), vous pouvez utiliser un plugin Vim que j'ai créé appelé interactif-replace .


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.