Apakah ada cara untuk menghitung jumlah kemunculan kata dalam file?
68
Apakah mungkin menghitung berapa kali suatu kata atau pola muncul dalam file? Ini kadang berguna untuk mengetahui berapa kali suatu fungsi dipanggil, dll.
Jawaban Quincy baik-baik saja, tetapi ada cara tepat untuk melakukan ini yang tidak memerlukan pengeditan buffer:
:%s/pattern//ng
Ini akan mencetak pesan seperti 3 matches on 2 lines, dan tidak ada perubahan yang dilakukan pada buffer Anda.
The nbendera membuat :substituteperintah mencetak jumlah pertandingan bukan melakukan substitusi yang sebenarnya; yang gbendera memungkinkan pelaporan beberapa pertandingan per baris.
Hal lain yang mungkin berguna untuk use case Anda adalah mencetak semua baris yang cocok dengan pola:
:global/pattern/print
yang dapat disingkat menjadi:
:g/pattern
Ini adalah salah satu penggunaan :globalperintah yang paling sederhana (yang sangat kuat). Ini hanya akan mencetak semua baris yang cocok pattern, dan kemudian (jika ada lebih dari satu baris) Anda menekan Enteratau mengetik perintah lain untuk membuatnya pergi.
Sedikit hal-hal sepele: Perintah ini adalah asal dari nama grep, seperti yang biasa digambarkan sebagai g/re/p, di mana resingkatan dari "regular expression".
+1 Ini adalah jawaban yang agak bagus, di tempat dan cukup detail pada saat yang bersamaan. Mari berharap sebagian besar pertanyaan mendapatkan jawaban seperti itu! :)
yo '
Jawaban yang bagus dan trivia yang luar biasa!
BiBi
Saya harus melakukan ini mungkin 2-3 kali dalam setahun dan tidak pernah mengingat sintaksnya jadi itu ke mesin pencari, setiap kali. Hanya ingin mengucapkan terima kasih atas jawaban yang jelas ini karena sudah ada untuk saya lebih dari sekali dan telah, selama beberapa tahun sekarang, menyelamatkan saya halaman wikia yang mengerikan itu! (wikia, bukan konten halaman)
Will
1
Bit minor: perintah g/re/psebenarnya dari ed, bukan vi. Grep mendahului vi dalam beberapa tahun.
Will
Saya punya nnoremap <leader>n :%s///gn<CR>pemetaan. Jadi saya tekan <leader>nuntuk menghitung kemunculan pola yang sebelumnya dicari. Saya sering menggunakan ini secara mengejutkan.
Rolf
15
:%s/pattern//nThe nbendera pada akhirnya memberitahu :sperintah untuk melaporkan jumlah pertandingan dan tidak benar-benar pengganti. Baca :h :s_flagsuntuk lebih jelasnya.
@yo 'Ya, meskipun g hanyalah bendera lain, Anda juga ingin menggunakannya gjika Anda merasa mungkin ada lebih dari satu kecocokan per baris, yang seringkali benar. Namun untuk keperluan pertanyaan, bendera nitu lebih penting.
Dhruva Sagar
5
Pertama gunakan /untuk mencari regex, lalu
:%s///gn
Ini sama dengan jawaban Dhurva, kecuali itu a.) Lebih mudah digunakan (karena Anda dapat melihat dulu hasil dari apa yang cocok dengan regex Anda terlebih dahulu) dan b.) Cocok secara global dengan gbendera untuk menghitung semua kemunculan.
Berkat PR ini https://github.com/vim/vim/pull/4317 , setiap perintah pencarian menunjukkan statistik pencarian (seperti posisi pertandingan saat ini, dan jumlah pertandingan) di vim 8.1.1270. Pastikan untuk menghapus Sdari variabel shortmess.
Pemetaan yang saya tambahkan ke .vimrc saya berdasarkan jawaban di sini:
" count nr of occurrences of word under cursor
nnoremap <leader>c :%s/<c-r><c-w>//gn<cr>
" count nr of occurrences of visual selection
vnoremap <leader>c :<c-u>%s/<c-r>*//gn<cr>
Sedikit penjelasan, semoga bermanfaat bagi yang lebih baru:
<c-r><c-w> menyisipkan kata di bawah kursor di baris perintah, berguna dalam banyak kesempatan.
The <c-u>diperlukan untuk menghapus secara otomatis dimasukkan '<,'>
ketika menekan :dalam mode visual dan pergi ke baris perintah. The
*mendaftar berisi (terakhir) seleksi visual, <c-r>*
menyisipkan isi dari *register command line (juga dapat digunakan dalam modus insert).
:h count-items
Jawaban:
Jawaban Quincy baik-baik saja, tetapi ada cara tepat untuk melakukan ini yang tidak memerlukan pengeditan buffer:
Ini akan mencetak pesan seperti
3 matches on 2 lines
, dan tidak ada perubahan yang dilakukan pada buffer Anda.The
n
bendera membuat:substitute
perintah mencetak jumlah pertandingan bukan melakukan substitusi yang sebenarnya; yangg
bendera memungkinkan pelaporan beberapa pertandingan per baris.Hal lain yang mungkin berguna untuk use case Anda adalah mencetak semua baris yang cocok dengan pola:
yang dapat disingkat menjadi:
Ini adalah salah satu penggunaan
:global
perintah yang paling sederhana (yang sangat kuat). Ini hanya akan mencetak semua baris yang cocokpattern
, dan kemudian (jika ada lebih dari satu baris) Anda menekanEnter
atau mengetik perintah lain untuk membuatnya pergi.Sedikit hal-hal sepele: Perintah ini adalah asal dari nama
grep
, seperti yang biasa digambarkan sebagaig/re/p
, di manare
singkatan dari "regular expression".sumber
g/re/p
sebenarnya daried
, bukanvi
. Grep mendahului vi dalam beberapa tahun.nnoremap <leader>n :%s///gn<CR>
pemetaan. Jadi saya tekan<leader>n
untuk menghitung kemunculan pola yang sebelumnya dicari. Saya sering menggunakan ini secara mengejutkan.:%s/pattern//n
Then
bendera pada akhirnya memberitahu:s
perintah untuk melaporkan jumlah pertandingan dan tidak benar-benar pengganti. Baca:h :s_flags
untuk lebih jelasnya.sumber
gn
?g
jika Anda merasa mungkin ada lebih dari satu kecocokan per baris, yang seringkali benar. Namun untuk keperluan pertanyaan, benderan
itu lebih penting.Pertama gunakan
/
untuk mencari regex, laluIni sama dengan jawaban Dhurva, kecuali itu a.) Lebih mudah digunakan (karena Anda dapat melihat dulu hasil dari apa yang cocok dengan regex Anda terlebih dahulu) dan b.) Cocok secara global dengan
g
bendera untuk menghitung semua kemunculan.sumber
Berkat PR ini https://github.com/vim/vim/pull/4317 , setiap perintah pencarian menunjukkan statistik pencarian (seperti posisi pertandingan saat ini, dan jumlah pertandingan) di vim 8.1.1270. Pastikan untuk menghapus
S
dari variabelshortmess
.sumber
:%s/pattern//g
Anda akan melihat jumlah pergantian di bilah status. Itulah berapa kali
pattern
muncul. Kemudian cukup tekanu
untuk membatalkan substitusi.sumber
Pemetaan yang saya tambahkan ke .vimrc saya berdasarkan jawaban di sini:
Sedikit penjelasan, semoga bermanfaat bagi yang lebih baru:
<c-r><c-w>
menyisipkan kata di bawah kursor di baris perintah, berguna dalam banyak kesempatan.The
<c-u>
diperlukan untuk menghapus secara otomatis dimasukkan'<,'>
ketika menekan:
dalam mode visual dan pergi ke baris perintah. The*
mendaftar berisi (terakhir) seleksi visual,<c-r>*
menyisipkan isi dari*
register command line (juga dapat digunakan dalam modus insert).sumber