Tìm kiếm chuỗi và đếm trong trình soạn thảo vi


105

Tôi muốn tìm kiếm một chuỗi và tìm số lần xuất hiện trong một tệp bằng trình chỉnh sửa vi.


11
Câu trả lời đã chọn ( :g/xxxx/d) là khủng khiếp, nguy hiểm và kém hơn những câu trả lời khác trên trang này. Vui lòng bỏ chọn nó.
Bruno Bronosky

1
tôi đồng ý và nó chỉ cho bạn biết 'dòng xóa' không 'xuất hiện xóa'
user1709076

Câu trả lời:


4
:g/xxxx/d

Thao tác này sẽ xóa tất cả các dòng có mẫu và báo cáo số lượng đã xóa. Hoàn tác để lấy lại sau.


6
Tất nhiên, anh ta có thể bỏ qua chữ "d" để không phải thực hiện thao tác.
Rook

15
Lưu ý rằng điều này chỉ cho bạn biết có bao nhiêu dòng - không phải bao nhiêu lần xuất hiện. Tôi nghĩ rằng dirk's là một giải pháp tốt hơn.

4
Giải pháp của tôi bên dưới tính đúng nhiều lần xuất hiện trong một dòng và không có gì phải hoàn tác.
Mohit Chakraborty

6
Rất nguy hiểm: o
Ankit Zalani

1
Đây không được cho là câu trả lời được chấp nhận / phổ biến nhất. Điều hành viên SO tối đa là gì? :(
user1412066

181

CÁCH là

:% s / pattern // gn


2
Đây là câu trả lời xác thực nhất mà không sử dụng thủ thuật giết quá nhiều.
user1412066

1
câu trả lời tốt nhất!
Paulo Luvisoto

121

Bạn cần nlá cờ. Để đếm từ, hãy sử dụng:

:%s/\i\+/&/gn   

và một từ cụ thể:

:%s/the/&/gn        

Xem count-itemsphần tài liệu.

Nếu bạn chỉ cần nhập:

%s/pattern/pattern/g

thì dòng trạng thái sẽ cung cấp cho bạn số trận đấu trong vi.


Dường như câu trả lời này là dành cho người dùng Vim và không cho Vi :(
kadeshpa

Bạn chỉ có vi trên hệ thống của bạn? Phiên bản nào?
dirkgently

Ai đó đã gắn thẻ quesiton của bạn với vim trong đó ... Tôi đã xóa nó.
ojblass

38

:% s / string / string / g sẽ đưa ra câu trả lời.


Thật là một câu trả lời tốt hơn. +5 nếu có thể
ojblass

Tôi đoán nó sẽ chỉ làm việc khi không được sử dụng trong mô hình '*.'
AK

10
Không cần lặp lại chuỗi, chỉ cần làm %s/string//ng.
slm

23

(tương tự như Gustavo đã nói, nhưng bổ sung:)

Đối với bất kỳ tìm kiếm nào trước đây , bạn có thể thực hiện đơn giản:

:%s///gn

Một mẫu không cần thiết vì nó đã có trong thanh ghi tìm kiếm ( @/).

"%" - thực hiện s/trong toàn bộ tệp
"g" - tìm kiếm toàn cầu (với nhiều lần truy cập trong một dòng)
"n" - ngăn bất kỳ thay thế nào của s/- không có gì bị xóa! không có gì phải được hoàn tác!
(xem: :help s_flagđể biết thêm thông tin)

(Bằng cách này, nó hoạt động hoàn hảo với " Tìm kiếm văn bản được chọn trực quan ", như được mô tả trong vim-wikia tip171 )


3

sử dụng

:% s / mẫu / \ 0 / g

khi chuỗi mẫu quá dài và bạn không muốn nhập lại tất cả.


1

Câu trả lời ngắn gọn :

:% s / string-to-be-search // gn

Để học tập :

Có 3 chế độ trong VI editor như bên dưới nhập mô tả hình ảnh ở đây

  • :bạn đang nhập từ chế độ này Commandsang Command-linechế độ khác. Bây giờ, bất cứ điều gì bạn viết sau đó :đều có trên CLI (Giao diện dòng lệnh)
  • %schỉ định tất cả các dòng. Chỉ định phạm vi làm %phương tiện thay thế trong toàn bộ tệp. Cú pháp thay thế tất cả các lần xuất hiện là:%s/old-text/new-text/g
  • gchỉ định tất cả các lần xuất hiện trong dòng. Với glá cờ, bạn có thể thay thế toàn bộ dòng. Nếu gcờ này không được sử dụng thì chỉ xuất hiện đầu tiên trong dòng sẽ được thay thế.
  • n chỉ định xuất số lần xuất hiện
  • //dấu gạch chéo kép thể hiện sự thiếu sót replacement text. Bởi vì chúng tôi chỉ muốn tìm.

Khi đã có số lần xuất hiện, bạn có thể Nhấn Nphím để xem từng lần xuất hiện.

Để tìm và đếm trong phạm vi cụ thể của dòng từ 1 đến 10:

: 1,10s / xin chào // gn

  • Xin lưu ý, %toàn bộ tệp được bổ sung bằng ,các số dòng riêng biệt.

Để tìm và thay thế trong phạm vi cụ thể của dòng từ 1 đến 10:

: 1,10s / helo / hello / gn


0

Tôi đề nghị làm:

  1. Tìm kiếm với *để thực hiện "tìm kiếm có giới hạn" cho những gì bên dưới con trỏ hoặc thực hiện /patterntìm kiếm tiêu chuẩn .
  2. Sử dụng :%s///gnđể lấy số lần xuất hiện. Hoặc bạn có thể sử dụng :%s///nđể lấy số dòng có lần xuất hiện.

** Tôi thực sự với tôi có thể tìm thấy một trình cắm sẽ đưa ra thông báo "khớp N của N 1 trên N 2 dòng" với mọi tìm kiếm, nhưng than ôi.

Lưu ý: Đừng nhầm lẫn bởi cách diễn đạt phức tạp của đầu ra. Lệnh trước có thể cung cấp cho bạn một cái gì đó giống như 4 matches on 3 lineslệnh sau có thể cung cấp cho bạn 3 matches on 3 lines. Mặc dù chính xác về mặt kỹ thuật , nhưng cái sau lại gây hiểu nhầm và phải nói là '3 dòng trùng khớp'. Vì vậy, như bạn có thể thấy, thực sự không bao giờ cần sử dụng dạng sau (chỉ 'n'). Bạn nhận được cùng một thông tin, rõ ràng hơn và hơn thế nữa bằng cách sử dụng biểu mẫu 'gn'.

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.