2009-07-29 8 views

Répondre

9

Une autre possibilité:

:%s/\v<4([01]\d{2}|200)>/5\1/g 

Celui-ci fait 200 aussi bien, et il ne souffre pas de la « cure-dent syndrome se penchant » trop car il utilise le \v switch.

EDIT # 1: points d'ancrage aux limites de mots Ajouté ('<' et '>') pour empêcher le remplacement "14100" etc.


EDIT # 2: Il y a des cas où une "limite de mot" ne suffit pas de saisir correctement la motif voulu. Si vous voulez que l'espace blanc soit le facteur de délimitation, l'expression devient un peu plus complexe.

:%s/\v(^|\s)@<=4([01]\d{2}|200)(\s|$)@=/5\1/g 

où « (^|\s)@<= » est l'affût derrière l'affirmation de « début de ligne » ou « \s » et « (\s|$)@= » est l'anticipation pour « bout de ligne » ou « \s » .

+1

Je pense que c'est la manière la plus propre car il gère implicitement le cas difficile 4200 –

+0

celui-ci fonctionnera pour 4200 ainsi –

5
:%s/\<4\([01][0-9][0-9]\)\>/5\1/g 
+0

fonctionnera pour tous, sauf 4200 –

+0

Est-il un paramètre si on peut entrer dans : s/<4 (\\ [01] [0-9] [0-9])>/\ 5 \ 1/g – jskulski

1
:%s/\<4\([0-1][0-9][0-9]\)\>/5\1/g 

fera 4000 à 4199. Vous devrez alors faire 4200/5200 séparément.

Une explication rapide. Ce qui précède trouve 4, suivi de 0 ou 1, suivi de 0-9 deux fois. Les 0-1,0-9,0-9 sont enveloppés dans un groupe, et le remplacement (suivant la barre oblique) dit remplacer par 5 suivi du dernier groupe apparié (\ 1, c'est-à-dire le bit suivant le 4).

\ < et> sont les limites de mots, pour empêcher l'appariement contre 14002 (thx Adrian)

% signifie à travers toutes les lignes./g signifie chaque correspondance sur la ligne (pas seulement la première).

+1

Comment cela fonctionnera-t-il contre le numéro 140002? –

+1

Il vous manque un '\ 1', sauf erreur de ma part. – Tomalak

+0

Bon point. Corrigé –

1

Si vous ne voulez pas faire une recherche complète et remplacer pour une raison quelconque, rappelez-vous que ctrl-a incrémentera le numéro suivant en dessous ou après le curseur. Ainsi, en mode commande, vous pouvez frapper 1000 ctrl-a pour augmenter le nombre suivant en 1000.

Si vous êtes sous Windows, voir une réponse this question sur la façon de faire ctrl-a incrément au lieu de tout sélectionner.

0

Plus frappe, mais moins la pensée:

:%s/\d\+/\=submatch(0) >= 4000 && submatch(0) <= 4200 ? submatch(0) + 1000 : submatch(0)/g