2010-03-24 46 views
8

Có một vài câu hỏi "làm cách nào để đảo ngược một câu hỏi" ở đây trên Stack Overflow, nhưng tôi không thể tìm thấy câu trả lời cho vim (nếu nó tồn tại, Google-fu của tôi thiếu ngày hôm nay).Đảo ngược regexp trong vim

Bản chất tôi muốn khớp với tất cả các ký tự không in được và xóa chúng. Tôi có thể viết một kịch bản ngắn, hoặc thả vào một vỏ và sử dụng tr hoặc một cái gì đó tương tự như xóa, nhưng một giải pháp vim sẽ là dandy :-)

Vim có nguyên tử \p để phù hợp với các ký tự in được, tuy nhiên :s/[^\p]//g để đối sánh nghịch đảo không thành công và chỉ để lại tôi với mọi 'p' trong tệp. Tôi đã nhìn thấy chuỗi (?!xxx) trong các câu hỏi khác và vim dường như không nhận ra chuỗi này. Tôi đã không tìm thấy một nguyên tử cho các ký tự không thể in được.

Trong thời gian chuyển tiếp, tôi sẽ thả vào các công cụ bên ngoài, nhưng nếu có ai ấy có bất kỳ thủ đoạn lên tay áo của họ để làm điều này, nó sẽ được chào đón :-)

Tạ!

+0

Biểu thức Perl/pcre '(?! Xxx)' có cùng ý nghĩa với cụm từ '\ (xxx \) \ @!' Vim, nhưng tôi không nghĩ rằng điều này sẽ giúp bạn. – ZyX

Trả lời

10

Thật không may là bạn không thể đặt \p trong các lớp nhân vật, mặc dù đó sẽ là một tính năng tuyệt vời. Tuy nhiên bạn có thể sử dụng âm lookahead tính năng \@! để xây dựng tìm kiếm của bạn:

/\p\@!. 

này đầu tiên sẽ đảm bảo rằng các . chỉ có thể phù hợp khi nó không phải là một nhân vật \p.

+0

Công cụ hàng đầu - đã thực hiện công việc, cổ vũ :-) –

1

Tôi cũng hơi bối rối vì sao bạn không thể sử dụng \ p. Nhưng, [: print:] hoạt động tốt:

:s/[^[:print:]]//g 
+2

Điều này không hỗ trợ unicode: 'echo" Å "= ~ '[[: in:]]'" Å "= ~ '\ p'' kết quả trong' 0 1'. – ZyX

+2

@ZyX: Bắt tốt. Tôi tự hỏi tại sao '[: print:]' không bao gồm các ký tự unicode có thể in được? – Cascabel

+0

(Hai năm sau) ... Tôi không thể nhớ phiên bản Vim nào ban đầu tôi đã hỏi câu hỏi này, nhưng vim 7.3 (những gì tôi đã cài đặt vào lúc này), '[: print:]' hỗ trợ Unicode và từ trên từ @ZyX ngay bây giờ (chính xác) trả về '1 1'. –

1

Nếu bạn muốn lọc tập tin với Unicode (chỉ khi fileencoding = utf-8) ký tự in, bạn có thể làm điều này trong ba bước: đánh dấu tất cả các ký tự in với không được sử dụng biểu tượng UTF-8 (ví dụ, với nr2char(0xFFFF)), xóa tất cả các nhân vật, mà không phải là tiếp theo biểu tượng này và, cuối cùng, xóa biểu tượng này:

%s/\p\@<=/<ffff>/g 
%s/[^<ffff>]<ffff>\@!//g 
%s/<ffff>//g 

Ở đây bạn phải thay thế <ffff> với nhân vật thực tế (nếu bạn nhập mã này, thay vì <ffff>, hãy nhập).

Nếu bạn không làm việc với Unicode, hãy sử dụng câu trả lời của dsummersl.