2010-11-18 34 views
40

Tôi sử dụng biểu thức (query-replace-regexp "from" "to") thường xuyên khi thực hiện các thay đổi lớn trong tệp văn bản.Emacs, xóa tất cả các dòng không khớp?

Tôi muốn biểu thức chính quy, nếu có, để xóa tất cả các dòng mà không phù hợp với. Ví dụ: trong tệp RedHat SPEC để tạo RPM, tôi muốn để lại chỉ các dòng bắt đầu bằng /^Patch/ trong chúng (và xóa tất cả các dòng không phù hợp). Đủ dễ dàng với grep -E '^Patch' nhưng có cách nào trong Emacs không?

tôi đã cố gắng:

(query-replace-regexp "^\\(?!Patch\\)[^\r\n]*$" "") 

vô ích (âm-lookahead xuất hiện không được hỗ trợ).

Bất kỳ ý tưởng nào?

Trả lời

76

Hãy thử M-x-giữ dòng^patch thay vì:

(keep-lines REGEXP &optional RSTART REND INTERACTIVE)

Xóa tất cả các dòng ngoại trừ những trận đấu chứa cho REGEXP.

Ngoài ra còn có lệnh ngược lại, M-x flush-lines, loại bỏ các dòng khớp với regexp.

+0

Điều này làm việc, cảm ơn bạn! –

4

Nếu nó chỉ là "Patch" bạn đang tìm kiếm, bạn có thể xác định dòng không phù hợp với ^Patch bằng cách sử dụng

^([^P]|P[^a]|Pa[^t]|Pat[^c]|Patc[^h])[^\r\n]*$ 

Tôi thừa nhận, nó là khá xấu xí, mặc dù. =)

+0

Haha .. thích nó! –

17

sử dụng M-x delete-non-matching-linesM-x delete-matching-lines

+0

Điều này làm việc, cảm ơn bạn! –

+8

Tài liệu cho 'xóa-không phù hợp-dòng' giải thích đây là một bí danh cho' keep-lines' và 'delete-matching-lines' là một bí danh cho' flush-lines'. –

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