2009-08-13 12 views
2

En utilisant Vim, j'aimerais pouvoir remplacer preVARIABLETEXTpost par VARIABLETEXT en une seule commande. La raison en est que pre et post peuvent exister ailleurs dans le fichier, et VARIABLETEXT changements.Vim remplacer preVARIABLETEXTpost avec VARIABLETEXT?

Quelque chose comme:

:% s/preGRABTEXTpost/GrabText/g

Essentiellement, je suis en train de dépouiller pre et post quand il existe avec un texte entre eux sur une seule ligne , bien qu'il puisse exister plus d'une fois sur une seule ligne. Je ne sais pas comment faire quelque chose comme une variable temporaire. . . Aidez-moi? Merci pour votre temps.

Répondre

2
:%s/\v<pre(.{-1,})post>/\1/g 

peut fonctionner, en fonction de votre saisie. Pour moi, ça change:

 
preAApost preBBpost 
preCCpost preDDpost 
preEEpost 
prepost 

à:

 
AA BB 
CC DD 
EE 
prepost 
0

L'opérateur regex . signifie «n'importe quoi». Le + signifie "au moins une fois, mais peut-être plus". Par conséquent:

:%s/pre(.+)post/\1/g 

Cela, malheureusement, correspondre à ce que un groupe:

preGRABTEXTpostMORETEXTwibbleEVENMORETEXTpost

Pour résoudre ce problème, nous le faisons paresseux en utilisant l'opérateur ?:

:%s/pre(.+?)post/\1/g 

Les parenthèses indiquent v im pour sélectionner cette partie en tant que groupe et le numéroter. Comme nous n'avons qu'un seul groupe, il est numéroté 1. Nous utilisons ensuite \1 dans le remplacement pour indiquer que nous voulons l'utiliser. Cela devrait le faire.

+0

Dans VIM, le paresseux '+' ne va pas comme '+?', Mais comme '\ {- 1, \}' – Tomalak

+0

Damnit, oublié à ce sujet. Merci pour le rappel. –

-1

Modifié: : (. {-})% s/pré post/\ 1/g

le tour est joué

+1

Non, ce n'est pas le cas. Il échoue pour le cas "multiple par ligne". – Tomalak

+0

:% s/pre \\ (. \ {-} \\) post/\ 1/g – Lliane

0

Si vous cherchez à faire cela pour une variable particulière, disons celle sous votre curseur, vous pouvez mapper une commande. Par exemple:

:map mm eb"aywo<esc>^Di:%s/pre<ESC>"apapost/<ESC>"apa/g<ESC>"[email protected] 

tracerait la combinaison de touches « mm » pour rechercher le texte sous le curseur entouré avant et après. Utile si vous avez plusieurs variables existant entre pré/post et que vous voulez seulement vous en débarrasser.