Vim Regex-Erfassungsgruppen [bau -> byau: ceu -> cyeu]

132

Ich habe eine Liste von Wörtern:

bau
ceu
diu
fou
gau

Ich möchte diese Liste in Folgendes verwandeln:

byau
cyeu
dyiu
fyou
gyau

Ich habe den Befehl erfolglos versucht:

:%s/(\w)(\w\w)/\1y\2/g

Was muss ich ändern, damit die Regex-Erfassungsgruppen in Vim funktionieren, da dies nicht funktioniert?

Christian
quelle
4
Es ist ein bisschen abseits des Themas, also habe ich es hier als Kommentar eingefügt, aber ... ich würde es tun :%norm ay<CR>.
Romainl
2
In Ihrem Fall (wenn es genau wie beschrieben ist) können Sie: in die 2. Spalte mit wechseln l, den Visual Block-Modus mit Ctrl+vaufrufen, die gesamte Spalte mit markieren, Shift+ggefolgt von l, dann den Einfügemodus mit aufrufen Shift+iund 'y' eingeben . 7 Tastenanschläge, einschließlich Abschluss Esc, um den Einfügemodus zu verlassen. Nicht als Antwort posten, da es nicht wirklich um Erfassungsgruppen geht (wonach ich gesucht habe, als ich diese gefunden habe). :-)
LAFK sagt Reinstate Monica

Antworten:

223

Eine Möglichkeit, dies zu beheben, besteht darin, sicherzustellen, dass das Muster in Klammern eingeschlossen ist:

:%s/\(\w\)\(\w\w\)/\1y\2/g

Etwas kürzer (und mehr Magie -al) zu verwenden ist \v, dass , nachdem sie alle ASCII - Zeichen außer im Muster bedeutet '0'-'9', 'a'-'z', 'A'-'Z'und '_'eine besondere Bedeutung haben:

:%s/\v(\w)(\w\w)/\1y\2/g

Sehen:

Johnsyweb
quelle
41

Wenn Sie den Erfassungsgruppen nicht mit Backslashes entkommen möchten (dies haben Sie verpasst), stellen Sie vor \v, um die Vim-Engine für reguläre Ausdrücke in einen sehr magischen Modus zu verwandeln :

:%s/\v(\w)(\w\w)/\1y\2/g
Ingo Karkat
quelle
Ingo, entschuldigen Sie, dass Sie eine Frage an der falschen Stelle gestellt haben: Dies funktioniert in :exmode; Gibt es eine Möglichkeit, dies im Dialogfeld Suchen / Ersetzen von gvim zu tun?
JJoao
3
@JJoao: Nein, das Such- / Ersetzungsfeld dient nur zur wörtlichen Suche und zum Ersetzen. Das solltest du sowieso nicht benutzen; Es sind nur Stützräder für Notepad-Benutzer.
Ingo Karkat
Ingo, danke (es ist nicht für mich: Ich bin zufrieden mit exmode, sondern für Linguisten-Mitarbeiter in einem Wörterbuchprojekt): Es funktioniert fast - mit \v...Regexp-Arbeit zu finden; in der Ersatzzeichenfolge, &funktioniert aber \ geschützt ( \1\rsind verloren)
JJoao
@JJoao: Ja, das habe ich auch beim Spielen herausgefunden. Ich bin immer noch skeptisch, ob die Verwendung von Vim ohne Ex-Modus eine gute Idee ist, aber Sie können problemlos einen eigenen Dialog zum Suchen und Ersetzen (intern unterstützt von :s) über inputdialog()und ein bisschen Vimscript erstellen.
Ingo Karkat
Ingo: Nochmals vielen Dank. Ich stimme Ihrer skeptischen Meinung zu. Inputdialg +: s + vimscript ist wahrscheinlich die Art und Weise, wie gvims find replace erstellt wird. Für mich ist die \1 \r Behandlung ein GVIM-Fehler. Ich werde versuchen, es in einer vim-spezifischen Liste zu veröffentlichen. In der Zwischenzeit werde ich meinen einen vimscript-inputdialog ausprobieren.
JJoao
34

Sie können auch dieses kürzere Muster verwenden:

:%s/^./&y
  • %s Wendet das Muster auf die gesamte Datei an.
  • ^. entspricht dem ersten Zeichen der Zeile.
  • &yfügt das ynach dem Muster hinzu.
Juan
quelle
13

Sie müssen sich auch der Gruppierungsparanthesis entziehen:

:%s/\(\w\)\(\w\w\)/\1y\2/g

Das macht den Trick.

Henkersmann
quelle