Sử dụng vim để xóa tất cả các dòng ngoại trừ những dòng khớp với một chuỗi tùy ý


6

Tôi sử dụng vim để xóa tất cả các dòng ngoại trừ các dòng khớp với một chuỗi cụ thể, ví dụ:

: g! / [chuỗi mà tôi muốn ở lại trong trình chỉnh sửa] / d

Công trình tuyệt vời. Nhưng điều tôi thực sự muốn và không tìm thấy ở bất cứ đâu, là cách sử dụng vim để xóa tất cả ngoại trừ nhiều chuỗi.

Ví dụ: giả sử tôi mở tệp với thông tin sau:

Dave came at 12PM
Lucy came at 11AM
Trish came at 5PM
John ate lunch at 2PM
Virgil left at 3PM
Dave left at 6PM

và tôi muốn chỉ còn lại các sự kiện đề cập đến Dave và John - tôi có thể sử dụng lệnh vim nào để kết thúc với:

Dave came at 12PM
John ate lunch at 2PM
Dave left at 6PM

Tôi nhận ra rằng tôi có thể sử dụng các công cụ dòng lệnh như findstr trong Windows và các công cụ khác trong * nix, nhưng tôi ở vim khá thường xuyên và không thể thực hiện được với bất kỳ lệnh regex hoặc vim nào sẽ làm điều này. Cảm ơn bạn!

Câu trả lời:


13

Các :global lệnh mà bạn tham chiếu trong câu hỏi của bạn thực sự không chỉ lấy các chuỗi ký tự, nó xử lý bất kỳ biểu thức chính quy nào. Vì vậy, bạn chỉ cần đưa ra một nhánh có hai nhánh, một nhánh cho John và một cho Dave. Voila:

:g!/Dave\|John/d

Lưu ý rằng cái đơn giản này cũng sẽ phù hợp Johnny; bạn có thể muốn giới hạn các trận đấu để toàn bộ từ khóa :

:g!/\<\(Dave\|John\)\>/d

Biểu thức chính quy là một tính năng mạnh mẽ của Vim; thật đáng để tìm hiểu thêm về họ. Bắt đầu lúc :help regular-expression.


1
OMG Tôi quên thoát khỏi đường ống khi tôi thử điều đó. Tôi sẽ làm điều đó ngay bây giờ! Cảm ơn bạn.
Dave

2
Đó, hoặc sử dụng \v Công cụ sửa đổi "rất kỳ diệu" cho phép bạn bỏ qua hầu hết các dấu gạch chéo ngược, như trong câu trả lời của Lieven Keersmaekers.
Ingo Karkat

Điều đó là vậy đó. Tôi đã thoát khỏi mọi thứ trong regex của mình nhưng bằng cách nào đó đã bỏ qua đường ống. :)
Dave

1
Để lưu một ký tự, bạn có thể sử dụng :v thay vì :g!.
Kevin

6

Sau đây nên làm điều đó

:v/\v(Dave|John)/d

Phá vỡ

:v                  matches all lines not containing the search expression 
/\vDave|John        search expression
/d                  execute delete on all those lines 

0

Dùng cái này:

:%s/^[^Dave|John].*\n//

Ý nghĩa:

%            means search the whole file
^            at the beginning of the line
[^Dave|John] something that isn't Dave nor John
.*           match anything
\n           new line character
//           replace with nothing

3
Sử dụng :s để loại bỏ toàn bộ dòng là cồng kềnh hơn :g từ câu hỏi Và đó [^Dave|John] là vô nghĩa.
Ingo Karkat
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.