2009-05-18 8 views
10

Étant donné le texte suivant à Vim:Vim recherche et remplace en décrémentant la référence arrière?

[2] [3] [4] 

Je veux effectuer une recherche et remplacer et produire ce qui suit:

[1] [2] [3] 

Je sais comment en extraire les chiffres à l'aide de back-référence via la recherche et remplacez:

:%s/\[\(\d\)\]/[\1]/g 

Mais maintenant, la question est comment allez-vous décrémenter la valeur de \ 1.

Des idées?

Répondre

16

Essayez

:%s/\[\(\d\+\)\]/\=join(['[', submatch(1) - 1, ']'], '')/g 

EDIT: J'ai ajouté un \+ après \d au cas où vous vouliez correspondre plus de nombres à un chiffre.

Voir :help sub-replace-special

+0

Impressionnant! Connaissez-vous de bonnes documentations en utilisant \ = dans la recherche et le remplacement? –

+0

Essayez: aide sous-remplacement-expression – sykora

0

Essayez ceci:

%s:\d:\r&\r:g 

Puis

s/\d/\=submatch(0)-1/ 

Et maintenant, vous devez joindre les lignes.

2

Lorsque vous utilisez \zs et \ze pour ancrer le nombre à l'intérieur des crochets sans les assortir, la substitution devient plus simple, parce que vous ne avez pas besoin de concaténer dans le remplacement:

:%s/\[\zs\d\+\ze]/\=submatch(0)-1/g 
Questions connexes