Apakah ada cara untuk menghitung jumlah kemunculan kata dalam file?


Jawaban:


94

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".


2
+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.


4
Bukan gn?
yo '

1
@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.


3

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.


2

:%s/pattern//g

Anda akan melihat jumlah pergantian di bilah status. Itulah berapa kali patternmuncul. Kemudian cukup tekan uuntuk membatalkan substitusi.


1

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).

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.