2016-07-12 13 views
-1

würde ich ersetzen mag:In vim, wie kann man ein Muster durch mehrere Optionen ersetzen, abhängig von einem Teil der ursprünglichen Zeichenkette?

getLeftChild 
getRightChild 

mit

leftchild 
rightchild 

Ich weiß, wie dieser Pass in zwei tun: :s/getLeftChild/leftchild/g und :s/getRightChild/rightchild/g. Aber gibt es etwas wie :s/get\(.*\)Child/<if \1 == "Left" then replace it with "left", else "right">child/g?

+0

ich tun würde nur überprüfen ': s/get //' mit einem ' j ~' –

+0

@WayneWerner würden Sie Ihre Antwort erklären dagegen, ? – tnabdb

Antwort

3

Wenn Sie die Substitution in einem Schuss tun mögen, können Sie die Verwendung des eingebauten in tolower() functio machen n:

%s/\vget(.*Child)/\=tolower(submatch(1))/ 

Sie können das Suchmuster für Ihre reale Datei anpassen.

Oder Sie können \L verwenden, um die Kleinbuchstabensubstitution zu tun. (kommentiert von @Meninx).

%s/\vget(.*Child)/\L\1/ 

Vielleicht möchten Sie den Unterschied zwischen \L and \l und \U and \u

+1

Eine andere Alternative für die Antwort oben: '% s/\ vget (. *)/\ L \ 1 /' –

+1

@Meninx ja, das wäre auch ein guter Weg. Ich fügte meine Antwort hinzu, ich hoffe, es macht Ihnen nichts aus. – Kent

2

Ich hatte ähnliche Bedürfnisse vorher. Ich könnte tun

:1,2s/get// (na ja, was würde schalten Sie ihn in

1 LeftChild 
2 RightChild 

Aber ich bin viel eher <C-v><count>j$ugvV:s/^get// zu tun (wo bedeutet <count> so etwas wie 1 oder 10) (obwohl, wenn es ein Absatz wie dies würde ich eher v} oder vielleicht verwenden vip den zu Absatz wählen.

+1

müssen Sie '%' hinzufügen, um alle Zeilen nach ':' in Ihrem ersten Befehl zu behandeln! ':% s/get' wird auch funktionieren! –

+0

Es gibt Chancen, dass das Wort get allein oder mit anderen Wörtern wie 'getParent' zum Beispiel erscheint. – SibiCoder

+1

gut, jeder Bereich - was "Zeile #, Zeile #", "markieren, markieren", wie Sie sagten, '%' für die gesamte Datei sein könnte. Obwohl typisch für mich, würde ich den Text hervorheben, den ich möchte, * meistens * weil, wenn es hervorgehoben wird, ich ** weiß ** Ich werde keinen zusätzlichen Text darin haben. –