2012-01-13 31 views
13

Ứng dụng trên máy tính của tôi cần đọc trong một tệp văn bản. Tôi có vài cái và một cái không hoạt động; chương trình không đọc nó và nói với tôi rằng có một nhân vật xấu trong đó đâu đó. Suy đoán đầu tiên của tôi là có một nhân vật không phải ascii ở đâu đó, nhưng tôi không biết làm thế nào để tìm ra nó. Perl hoặc bất kỳ regex chung nào sẽ tốt đẹp. Bất kỳ ý tưởng?tài liệu tìm kiếm cho non ascii

+0

cậu thử làm gì cho đến nay? – nmagerko

+0

Tôi tin rằng bạn có thể tìm thấy câu trả lời [ở đây] (http://stackoverflow.com/questions/881931/how-can-i-find-extended-ascii-characters-in-a-file-using-perl)? – Neilos

+1

Tôi chấp nhận cà phê toán học bởi vì nó cực kỳ hiệu quả trong Notepad ++ –

Trả lời

12

Bạn có thể sử dụng [^\x20-\x7E] để khớp với một ký tự không phải ASCII.

ví dụ: grep -P '[^\x20-\x7E]' suspicious_file

+2

Tôi đã gặp vấn đề khi sử dụng, vì nó cũng sẽ xác định tất cả các ký tự cuối dòng trong tệp của tôi. Kết hợp câu trả lời của bạn với Ruakh mặc dù đã làm việc như một sự quyến rũ: [^ \ t \ n \ r \ x20- \ x7E] – JMM

+0

Trong trường hợp của tôi, [câu trả lời từ câu hỏi khác] (http://stackoverflow.com/a/ 882437/873282) là tốt hơn: '[\ xE0- \ xFF]' – koppor

4
perl -wne 'printf "byte %02X in line $.\n", ord $& while s/[^\t\n\x20-\x7E]//;' 

sẽ tìm mọi ký tự không phải là ký tự ASCII, tab, dấu cách hoặc dòng mới.

Nếu báo cáo 0D s (vận chuyển trả về) trong tệp O.K., sau đó thay đổi \t\n thành \t\n\r.

Nếu chỉ báo cáo 0D trong các tệp không tốt, bạn có thể sửa các tệp đó bằng cách chạy dos2unix trên chúng.

+0

Chỉ cần một phụ lục, người ta nên chạy đầu vào như là đối số cuối cùng không được liệt kê. –

+0

Như vậy, cảm ơn bạn! Tôi đã phải thay đổi nó một chút cho một giao diện điều khiển DOS: 'perl -wne" printf qq (byte% 02X trong dòng $. \ N), ord $ và trong khi s/[^ \ t \ n \ x20- \ x7E]//; " rplantiko

2

Nếu bạn sử dụng tabulators trong mã nguồn của bạn là tốt, cố gắng mô hình này:

[^\x08-\x7E] 

trình cũng trong Notepad ++

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