Pencarian interaktif / ganti regex di Vim?


265

Saya tahu regex untuk melakukan penggantian global,

     %s/old/new/g

Bagaimana cara Anda melakukan pencarian-ganti interaktif di Vim ?

Jawaban:


463

Tambahkan flag c (pada prompt perintah vim):

:%s/old/new/gc

akan memberi Anda konfirmasi ya / tidak pada setiap kemunculan 'lama'.

"lama" disorot dalam teks;  di bagian bawah jendela tertulis "ganti dengan yang baru (y / n / a / q / l / ^ E / ^ y)?)"

Bantuan bawaan Vim menawarkan info berguna tentang opsi yang tersedia setelah penggantian dengan konfirmasi telah dipilih. Menggunakan:

:h :s

Kemudian gulir ke bagian opsi konfirmasi. Tangkapan layar di bawah ini:

Teks yang mengatakan "[C] Konfirmasikan setiap substitusi. [...] CTRL-Y untuk menggulir layar ke bawah"

Misalnya, untuk mengganti ini dan semua kecocokan yang tersisa, gunakan a.


30
+1, saya belajar sesuatu yang baru hari ini! vim memiliki begitu banyak rahasia tersembunyi .. :)
Marc Novakowski

10
Mempelajari perintah vim sedikit mirip dengan bermain Nethack. Anda tidak pernah tahu keajaiban apa yang akan dimiliki oleh satu karakter.
Mark Biek

22
Saya membayangkan "c" adalah untuk "confirm"
matpie

8
Sejujurnya saya tidak mencoba untuk dianggap sebagai snarky, tetapi semua ini bisa ditemukan dengan melakukan ": help: s" yang akan mengarahkan Anda langsung ke ": help: s_flags".
Jeremy Cantrell

13
@ Jeremy: itu membutuhkan mengetahui bahwa perintah bantuan ada, dan mengetahui bahwa seseorang perlu mengetikkan "titik dua" untuk membawa Anda ke file bantuan yang relevan. Bagaimana atau di mana orang akan mempelajarinya?
Dennis

79

Mark Biek menunjukkan menggunakan:

%s/old/new/gc

untuk pencarian global, ganti dengan konfirmasi untuk setiap substitusi. Tapi, saya juga menikmati verifikasi secara interaktif bahwa teks lama akan cocok dengan benar. Pertama saya melakukan pencarian dengan regex, lalu saya menggunakan kembali pola itu:

/old.pattern.to.match
%s//replacement/gc

The s//akan menggunakan pola pencarian terakhir.


9
Salah satu hal terbesar tentang menggunakan / belajar vim adalah seberapa dalam lubang kelinci!
ken

2
Bagus, saya selalu melakukan pencarian, kemudian menggunakan <Cr> / untuk menempelkan pencarian terakhir ke perintah pengganti.
Atilla Filiz

Persis apa yang saya lewatkan dari Sublime Text!
Xenofex

Jawaban ini sangat berguna, seperti yang saya bayangkan banyak kali Anda memutuskan untuk mengganti contoh kata, itu kata yang baru saja Anda cari.
M_M

20

Saya pikir Anda sedang mencari c, misalnya s/abc/123/gc, ini akan menyebabkan VIM mengkonfirmasi penggantian. Lihat: bantuan: gantikan informasi lebih lanjut.


9

Saya biasanya menggunakan perintah find / substitute / next / repeat :-)

/old<CR>3snew<ESC>n.n.n.n.n.n.n.

Yang ini find "old", substitute 3 characters for "new", find next, repeat substitute, dan sebagainya.

Ini merepotkan bagi pergantian besar-besaran tetapi memungkinkan Anda secara selektif mengabaikan beberapa kejadian lama (dengan hanya menekan nlagi untuk menemukan yang berikutnya alih-alih .mengulangi pergantian).


Saya menggunakan ini juga, bahkan untuk teks serupa. (3cW <texthere> <ESC> <pindah ke lokasi baru>. <move>. <move>.)
strager

1
Ini bukan antipattern! Rasanya manis. Dan Anda dapat mencari di arah yang berlawanan menggunakan N. Sangat bagus jika Anda melihat kata dan ingin mengubahnya. * cwNewText <ESC> Nnn (Ini akan melompat jauh dari kata di bawah kursor, tetapi kemudian melompat kembali segera setelah Anda mengubah kemunculan berikutnya.
PEZ

apa <CR>?
Sother

9

Jika Anda hanya ingin menghitung jumlah kemunculan 'abc' maka Anda bisa melakukannya %s/abc//gn. Ini tidak menggantikan apa pun tetapi hanya melaporkan jumlah kemunculan 'abc'.


3

Jika teks pengganti Anda perlu diubah untuk setiap kejadian yang cocok (yaitu tidak hanya memilih Ya / Tidak untuk menerapkan penggantian tunggal), Anda dapat menggunakan plugin Vim yang saya sebut interaktif-ganti .


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.