2009-06-10 10 views
6

Ich muss eine Liste von Wörtern mit einer ebenso langen Liste von Wörtern ersetzen.Vim Ersetzung einer Liste von Wörtern durch eine andere Wortliste gleicher Länge?

So zum Beispiel haben Sie: "a", "b", "c", "d", "e", "f"

Und wollen Sie jedes Wort mit der Großversion ersetzen jedes Wort: "A", "B", "C", "D", "E", "F"

ich weiß, wie jede Saite mit dem regulären Ausdruck zu finden: (a \ | b \ | c \ | d \ | e \ | f)

Ich weiß, dass Sie eine globale Ersetzung für jedes Wort tun könnten. Aber wenn die Länge der Wörter groß wird, würde dieser Ansatz unhandlich und unelegant werden.

Gibt es eine Möglichkeit, eine globale Substitution durchzuführen? Ähnlich wie:

:%s/\(a\|b\|c\|d\|e\|f\)/INSERT_REPLACEMENT_LIST/ 

Ich bin mir nicht sicher, ob das überhaupt möglich ist.

+1

Nur um meine Neugier zu befriedigen, würde es Ihnen etwas ausmachen zu sagen, wofür ist das? Ich meine, wofür ist es in der Praxis gut? Nichts kommt mir in den Sinn, also habe ich mich gefragt. – Rook

+0

@Idigas, ich mache eine Reihe von Refactoring auf einige schlechte Matlab-Code. Ich habe bemerkt, dass der Code 20-30 Globals verwendet und seine Globals sind nicht alle großgeschrieben oder so benannt, dass sie offensichtlich global sind. -> SO möchte ich sie alle umbenennen, um alle Großbuchstaben zu sein. Oder möglicherweise den gleichen Namen, aber fügen Sie "_g" nach jedem Variablennamen hinzu. –

+0

@ Idigas, schließlich werde ich das Matlab in C implementieren. Also möchte ich den Code vollständig verstehen und so elegant wie möglich machen, bevor ich zu C. –

Antwort

9

Sie können ein Wörterbuch mit Elementen verwenden, die ihren Ersetzungen zugeordnet sind, und diese dann auf der rechten Seite der Suche/Ersetzung verwenden.

:let r={'a':'A', 'b':'B', 'c':'C', 'd':'D', 'e':'E'} 
:%s/\v(a|b|c|d|e)/\=r[submatch(1)]/g 

Siehe :h sub-replace-\= und :h submatch(). Wenn Sie das in eine Zeile einfügen möchten, können Sie ein literales Wörterbuch verwenden.

:%s/\v(a|b|c|d|e)/\={'a':'A','b':'B','c':'C','d':'D','e':'E'}[submatch(1)]/g 

Das spezifische Beispiel Sie gaben Briefe von großgeschrieben einfacher als

:%s/[a-e]/\U\0/g 
+0

s/\\ (\ a \ + \\)/\ U \ 0/g, um alphabetische Zeichenfolgen in Großbuchstaben umzuwandeln. –

+1

Wenn Sie dies häufig tun, definieren Sie dafür eine vim-Funktion (http://stackoverflow.com/questions/765894/cani-i-substitute-multiple-items-in-a-single-regular-expression-in) -vim-or-perl/766093 # 766093) – rampion

+0

@Brian, was ist das "\ v" in deiner Vertretung? –

2

getan würde:% s/(a ​​\ | b \ | c \ | d \ | e \ | f)/\ U \ 0/g