2009-07-29 24 views

Antwort

9

Eine andere Möglichkeit:

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

Dies tut man 200 als gut, und es leidet nicht unter dem „schiefen Zahnstocher-Syndrom“ zu viel, da es die \v switch verwendet.

EDIT # 1: Hinzugefügt Wortgrenze Anker ('<' und '>') zu verhindern "14100" ersetzen usw.


EDIT # 2: Es gibt Fälle, in denen eine "Wortgrenze" nicht genug ist, um richtig die Erfassung gewünschtes Muster. Wenn Leerraum der Begrenzungsfaktor sein soll, wird der Ausdruck etwas komplexer.

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

wo "(^|\s)@<=" ist der Blick hinter Behauptung für "Start-of-line" oder "\s" und "(\s|$)@=" ist der Look-Ahead für "End-of-line" oder "\s" .

+1

Ich denke, das ist der sauberste Weg, da es den kniffligen 4200 Fall implizit behandelt –

+0

dieser wird auch für 4200 arbeiten –

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

wird außer 4200 für alle arbeiten –

+0

Gibt es eine Einstellung, so kann man eingeben : s/<4 (\\ [01] [0-9] [0-9])>/\ 5 \ 1/g – jskulski

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

4000 bis 4199. tun Sie müssen tun würden dann 4200/5200 getrennt.

Eine kurze Erklärung. Das obige findet 4, gefolgt von 0 oder 1, gefolgt von zweimal 0-9. Die 0-1,0-9,0-9 werden in eine Gruppe eingeschlossen, und die Ersetzung (folgend auf den Schrägstrich) sagt Ersetzen durch 5 gefolgt von der letzten übereinstimmenden Gruppe (\ 1, d.h. das Bit, das der 4 folgt).

\ < und> sind die Wortgrenzen, um Übereinstimmungen zu verhindern gegen 14002 (THX Adrian)

% bedeutet, in allen Linien./g bedeutet jede Übereinstimmung in der Zeile (nicht nur die erste).

+1

Wie funktioniert es gegen die Nummer 140002? –

+1

Sie vermissen ein '\ 1', es sei denn, ich täusche mich. – Tomalak

+0

Guter Punkt. Korrigiert –

1

Wenn Sie aus irgendeinem Grund keine vollständige Suche durchführen und ersetzen möchten, denken Sie daran, dass ctrl-a die nächste Zahl unter oder nach dem Cursor erhöht. So im Befehlsmodus, Sie 1000 ctrl-a treffen könnte die nächste Nummer von 1000.

Wenn Sie unter Windows sind zu erhöhen, eine Antwort in this question sehen, wie ctrl-a Schritt statt wählen Sie alle zu machen.

0

Mehr Typisierung, aber weniger denken:

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