Có cách nào để đếm số lần xuất hiện của một từ trong một tập tin không?


68

Có thể đếm được bao nhiêu lần một từ hoặc một mẫu xuất hiện trong một tập tin? Điều này đôi khi hữu ích để tìm hiểu bao nhiêu lần một chức năng đã được gọi, v.v.


Câu trả lời:


93

Câu trả lời của Quincy là tốt, nhưng có một cách chính xác để làm điều này mà không cần chỉnh sửa bộ đệm:

:%s/pattern//ng

Điều này sẽ in một thông báo như thế 3 matches on 2 lines, và sẽ không có thay đổi nào được thực hiện đối với bộ đệm của bạn.

Các nlá cờ làm cho :substitutelệnh in số lượng các trận đấu thay vì thực hiện một thay thực tế; các glá cờ cho phép báo cáo của nhiều trận đấu trên mỗi dòng.


Một điều khác có thể hữu ích cho trường hợp sử dụng của bạn là in tất cả các dòng khớp với một mẫu:

:global/pattern/print

có thể rút ngắn thành:

:g/pattern

Đây là một trong những cách sử dụng đơn giản nhất của :globallệnh (có sức mạnh đáng kinh ngạc). Nó chỉ đơn giản là in ra tất cả các dòng khớp pattern, và sau đó (nếu có nhiều hơn một dòng) bạn nhấn Enterhoặc gõ một lệnh khác để làm cho nó biến mất.

Một chút chuyện nhỏ: Lệnh này là nguồn gốc của tên grep, vì nó thường được mô tả là g/re/p, trong đó reviết tắt của "biểu thức chính quy".


2
+1 Đây là một câu trả lời khá hay, tại chỗ và chi tiết hợp lý cùng một lúc. Hãy hy vọng hầu hết các câu hỏi có được câu trả lời như vậy! :)
yo '

Câu trả lời tuyệt vời và những câu đố tuyệt vời!
BiBi

Tôi phải làm điều này có thể 2-3 lần một năm và không bao giờ nhớ cú pháp để mỗi lần tìm kiếm. Chỉ muốn nói lời cảm ơn vì câu trả lời rõ ràng này bởi vì nó đã ở đó cho tôi hơn một lần và, trong một vài năm nay, đã cứu tôi trang wikia khủng khiếp đó! (wikia, không phải nội dung của trang)
Sẽ

1
Bit nhỏ: lệnh g/re/pthực sự là từ ed, không vi. Grep có trước vi vài năm.
Sẽ

Tôi có một nnoremap <leader>n :%s///gn<CR>bản đồ. Vì vậy, tôi nhấn <leader>nđể đếm sự xuất hiện của mẫu tìm kiếm trước đó. Tôi sử dụng điều này đáng ngạc nhiên thường xuyên.
Rolf

15

:%s/pattern//nCác ncờ cuối cùng nói với :slệnh để báo cáo số lượng các trận đấu và không thực sự thay thế. Đọc :h :s_flagsđể biết thêm chi tiết.


4
Phải không gn?
yo '

1
@yo 'Có, mặc dù g chỉ là một cờ khác, bạn cũng muốn sử dụng gnếu bạn cảm thấy có thể có nhiều hơn một trận đấu trên mỗi dòng, điều này thường đúng. Đối với mục đích của câu hỏi tuy nhiên cờ nlà quan trọng hơn.
Dhruva Sagar

5

Đầu tiên sử dụng /để tìm kiếm một regex, sau đó

:%s///gn

Điều này giống như câu trả lời của Dhurva, ngoại trừ câu trả lời a.) Dễ sử dụng hơn (vì bạn có thể xem trước kết quả của regex của mình trước tiên) và b.) Kết hợp trên toàn cầu với gcờ để đếm tất cả các lần xuất hiện.


3

Nhờ PR này https://github.com/vim/vim/pull/4317 , mỗi lệnh tìm kiếm hiển thị số liệu thống kê tìm kiếm (như vị trí trận đấu hiện tại và số lượng trận đấu) trong vim 8.1.1270. Hãy chắc chắn để loại bỏ Skhỏi biến shortmess.


2

:%s/pattern//g

Bạn sẽ thấy số lượng thay thế trong thanh trạng thái. Đó là bao nhiêu lần patternxuất hiện. Sau đó chỉ cần nhấn uđể hoàn tác thay thế.


1

Một ánh xạ tôi đã thêm vào .vimrc của mình dựa trên các câu trả lời ở đây:

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

Một chút giải thích, hy vọng sẽ hữu ích cho các vimmer mới hơn:

  • <c-r><c-w> chèn từ dưới con trỏ vào dòng lệnh, tiện dụng trong nhiều trường hợp.

  • Các <c-u>là cần thiết để loại bỏ các tự động chèn vào '<,'> khi nhấn :trong chế độ hình ảnh và đi vào dòng lệnh. Thanh *ghi chứa lựa chọn trực quan (cuối cùng), <c-r>* chèn nội dung của thanh *ghi vào dòng lệnh (cũng có thể được sử dụng trong chế độ chèn).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.