2009-07-22 42 views
29

Tôi có tệp nhật ký có chuỗi "ERROR" trên một số dòng. Tôi muốn xóa mọi dòng mà không có ERROR để tôi có thể thấy chỉ những gì cần sửa. Tôi sẽ làm điều gì đó như sau trong vim:regex với kết hợp phủ định (ví dụ: tìm chuỗi _doesn't_ khớp với regex)

% s/(ERROR) //

để thay thế dòng không lỗi với một chuỗi rỗng.

Tôi không tin rằng regexes tiêu chuẩn có thể làm được điều này, nhưng có lẽ tôi sai ...

Trả lời

50

Sử dụng lệnh :g! để xóa tất cả các dòng đó không phù hợp.

:g!/ERROR/d 
+23

': v/ERROR/d' tương đương – rampion

0

Một regex đối sánh phủ định sẽ sử dụng^ Ví dụ: [^ E] sẽ phù hợp với tất cả mọi thứ trừ E.

+3

Đó là sự thật, nhưng một regex như vậy sẽ khớp với mọi * ký tự * không phải là E, khác với kết hợp tất cả * dòng * không chứa E. Ngoài ra, đối sánh tiêu cực là khó xử để mở rộng vượt quá một ký tự. –

1

nếu trên * nix, bạn có thể sử dụng grep -v hoặc awk

awk '!/ERROR/' file | more 

trên một máy Windows, bạn có thể sử dụng findstr

findstr /v /c:ERROR file | more 
8

Trong vim, bạn có thể chạy bất kỳ lệnh bộ lọc nào trên văn bản trong bộ đệm. Ví dụ:

:%!grep ERROR 

sẽ thay thế toàn bộ bộ đệm bằng chỉ các dòng khớp với cụm từ thông dụng nhất định.

Điều này hữu ích cho nhiều hơn chỉ grep, ví dụ: bạn có thể sắp xếp các dòng trong bộ đệm với :%!sort. Hoặc, bạn có thể làm tương tự cho bất kỳ phạm vi văn bản nào bằng cách sử dụng lệnh V để đánh dấu khối và sau đó :!filter-command (vim sẽ tự động điền vào '<,'> để bạn cho biết khối hiện được đánh dấu).

+0

+1 cho lệnh không yêu cầu rời khỏi vim/chuyển hướng sang tệp khác –

+0

Có thể không phải là ví dụ hay nhất, vì ': grep' và': sort' có ý nghĩa tích hợp trong Vim (khác với ':! grep' và':! sort', chỉ để gây nhầm lẫn). – ephemient

1

Sử dụng negative lookahead đã hoạt động.

+7

Không phải là một câu trả lời rất hữu ích mà không có ví dụ: ':% s/^ \ (\ ERROR \) \ @! $ \ N // g'. Trong Vim, '\ @!' Là chỉ báo tra cứu âm, không phải là định dạng '(?!)' Từ liên kết đó. Câu trả lời ': g!' Dễ dàng hơn. – atomicules

+0

Tôi đồng ý với @atomicules, nhưng tôi vẫn upvoting câu trả lời của Alexander vì 'lookahead tiêu cực' là một thuật ngữ hữu ích để tiếp tục tìm kiếm web. –

Các vấn đề liên quan