2009-08-13 15 views
2

Mit Vim möchte ich preVARIABLETEXTpost mit VARIABLETEXT in einem einzigen Befehl ersetzen können. Der Grund dafür ist, dass pre und post möglicherweise an anderer Stelle in der Datei vorhanden sind, und VARIABLETEXT Änderungen.Vim ersetzen preVARIABLETEXTpost mit VARIABLETEXT?

Etwas wie:

:% s/preGRABTEXTpost/GRABTEXT/g

Wesentlichen zwischen ihnen auf einer einzigen Zeile Ich versuche pre und post abzustreifen, wenn es mit etwas Text existiert , obwohl es vielleicht einmal in einer einzigen Zeile existieren könnte. Ich weiß einfach nicht, wie man etwas wie eine temporäre Variable macht. . . Hilfe? Vielen Dank für Ihre Zeit.

Antwort

2
:%s/\v<pre(.{-1,})post>/\1/g 

könnte funktionieren, je ein bisschen auf Ihre Eingabe. Für mich ist es ändert:

 
preAApost preBBpost 
preCCpost preDDpost 
preEEpost 
prepost 

zu:

 
AA BB 
CC DD 
EE 
prepost 
0

Der . Regex-Operator bedeutet "alles". Die + bedeutet "mindestens einmal, aber möglicherweise mehr". Deshalb:

:%s/pre(.+)post/\1/g 

Dies wird leider passen diese als eine Gruppe:

preGRABTEXTpostMORETEXTwibbleEVENMORETEXTpost

Um das zu beheben, haben wir es mit Hilfe der ? Betreiber faul:

:%s/pre(.+?)post/\1/g 

Die Klammern sagen v Im, um diesen Teil als Gruppe auszuwählen und zu nummerieren. Da wir nur eine Gruppe haben, ist sie nummeriert 1. Wir verwenden dann \1 im Ersatz, um anzuzeigen, dass wir es verwenden möchten. Dies sollte es tun.

+0

In VIM geht das faule '+' nicht wie '+?', Aber wie '\ {- 1, \}' – Tomalak

+0

Verdammt, vergaß ich das. Danke für die Erinnerung. –

-1

Edited: : (. {-})% s/pre post/\ 1/g

der Trick

+1

Nein, tut es nicht. Es schlägt für den Fall "mehrere pro Zeile" fehl. – Tomalak

+0

:% s/pre \\ (. \ {-} \\) post/\ 1/g – Lliane

0

Wenn Sie dies für eine bestimmte Variable tun möchten, sagen Sie die unter Ihrem Cursor, können Sie einen Befehl zuordnen. Zum Beispiel:

:map mm eb"aywo<esc>^Di:%s/pre<ESC>"apapost/<ESC>"apa/g<ESC>"[email protected] 

Möchten Sie die Tastenkombination ‚mm‘ Karte für den Text unter dem Cursor durch Pre- und Post umgeben zu suchen. Hilfreich, wenn Sie mehrere Variablen zwischen Pre-/Post-Text haben und nur eine bestimmte loswerden wollen.