Vim Regex Capture Groups [bau -> byau: ceu -> cyeu]

132

Saya punya daftar kata-kata:

bau
ceu
diu
fou
gau

Saya ingin mengubah daftar itu menjadi:

byau
cyeu
dyiu
fyou
gyau

Saya gagal mencoba perintah:

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

Mengingat ini tidak berhasil, apa yang harus saya ubah untuk membuat regex capture groups bekerja di Vim?

Kristen
sumber
4
Ini sedikit di luar topik jadi saya taruh di sini sebagai komentar tapi ... saya akan melakukannya :%norm ay<CR>.
romainl
2
Dalam kasus Anda (jika persis seperti yang dijelaskan), ini merupakan opsi untuk: pindah ke kolom ke-2 dengan l, masuk ke mode Blok Visual dengan Ctrl+v, tandai seluruh kolom dengan Shift+gdiikuti oleh l, lalu masuk ke mode Sisipkan dengan Shift+idan masukan 'y'. 7 penekanan tombol termasuk penyelesaian Escuntuk keluar dari mode Sisipkan. Tidak memposting sebagai jawaban karena ini bukan tentang menangkap grup (yang saya cari ketika saya menemukan ini). :-)
LAFK mengatakan Reinstate Monica

Jawaban:

224

Salah satu cara untuk memperbaikinya adalah dengan memastikan bahwa pola tertutup oleh tanda kurung yang lolos :

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

Sedikit lebih pendek (dan lebih magic -al) adalah dengan menggunakan \v, yang berarti bahwa dalam pola setelah semua karakter ASCII kecuali '0'-'9', 'a'-'z', 'A'-'Z'dan '_'memiliki arti khusus:

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

Lihat:

Johnsyweb
sumber
41

Jika Anda tidak ingin melarikan diri dari kelompok penangkap dengan garis miring terbalik (inilah yang Anda lewatkan), cukup ubah \vmesin ekspresi reguler Vim menjadi mode yang sangat ajaib :

:%s/\v(\w)(\w\w)/\1y\2/g
Ingo Karkat
sumber
Ingo, maaf karena menempatkan pertanyaan di tempat yang salah: Ini berhasil :exmode; apakah ada cara untuk melakukannya di gvim menemukan / mengganti kotak dialog?
JJoao
3
@ Jojo: Tidak, kotak temukan / ganti hanya untuk pencarian dan penggantian literal. Anda seharusnya tidak menggunakan itu; itu hanya roda pelatihan untuk pengguna Notepad.
Ingo Karkat
Ingo, terima kasih (ini bukan untuk saya: Saya senang dengan exmode, tetapi untuk kolaborator ahli bahasa dalam proyek kamus): ini hampir berhasil - dengan \v...penemuan pekerjaan regexp; dalam string pengganti, &bekerja tetapi \ dilindungi ( \1\rhilang)
JJoao
@ Jojo: Ya, itu yang saya temukan saat bermain dengannya juga. Saya masih ragu apakah menggunakan Vim tanpa mode Ex adalah ide yang bagus, tetapi Anda dapat dengan mudah membangun dialog pencarian dan ganti sendiri (didukung secara internal :s) melalui inputdialog()dan sedikit Vimscript.
Ingo Karkat
Ingo: Terima kasih lagi; Saya setuju dengan pendapat skeptis Anda. Inputdialg +: s + vimscript mungkin adalah cara gvim's find replace dibangun. Bagi saya \1 \r perawatan adalah bug gvim. Saya akan mencoba mempostingnya di beberapa daftar spesifik vim. Sementara itu saya akan mencoba satu vimscript-inputdialog saya.
JJoao
34

Anda juga dapat menggunakan pola ini yang lebih pendek:

:%s/^./&y
  • %s menerapkan pola ke seluruh file.
  • ^. cocok dengan karakter pertama dari garis.
  • &ymenambahkan ysetelah pola.
Juan
sumber
13

Anda juga harus melarikan diri dari paranthesis Pengelompokan:

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

Itu yang berhasil.

Henkersmann
sumber