2012-11-28 33 views
19

Tôi có tệp văn bản lớn chứa một vài ký tự unicode khiến LaTeX gặp sự cố. Làm cách nào để tìm các ký tự không phải ASCII trong một tệp có chứa sed và các ký tự tương tự trong một bash Linux?Cách tìm kiếm các ký tự không phải ASCII bằng các công cụ bash?

+4

Đây có phải là tệp trong UTF-8 hay không ký tự là ASCII, nhưng một số là UTF-8 nhiều byte được định dạng tốt và một số bị hỏng (multi-byte) UTF-8? Có nhiều ký tự UTF-8 (đa byte) được hình thành tốt không? Hoặc là một số mã hóa khác hoàn toàn? –

Trả lời

25

Hãy thử:

nonascii() { LANG=C grep --color=always '[^ -~]\+'; } 

Mà có thể được sử dụng như:

printf 'ŨTF8\n' | nonascii 

Trong []^ có nghĩa là "không". Vì vậy, [^ -~] nghĩa là các ký tự không nằm giữa khoảng trắng và ~. Vì vậy, không bao gồm các ký tự điều khiển, điều này khớp với các ký tự không phải ASCII và là một phiên bản di động hơn mặc dù phiên bản chính xác kém hơn [^\x00-\x7f] bên dưới. \+ có nghĩa là 1 or more và sẽ nhận các ký tự nhiều byte để có màu được hiển thị xung quanh (các) ký tự hoàn chỉnh, thay vì xen kẽ trong mỗi byte, do đó làm hỏng chuỗi nhiều byte

+0

wow nó hoạt động ngay cả trong màu đỏ đẹp. –

+0

bạn có thể giải thích cho tôi '[^ - ~] \ +' có nghĩa là gì không?^là bắt đầu của dòng afaik. –

+0

Rất đẹp. Nhưng các ký tự điều khiển (ngoại trừ dòng mới) được tìm thấy, mặc dù chúng thực sự là ASCII. Vì vậy, khi có tab, vận chuyển-trả về (dos tập tin), những người được tìm thấy. Bạn có thể cung cấp giải pháp thay thế chỉ in các ký tự không phải ASCII không? Cách tiếp cận '[^ \ x00- \ x7f]' trong câu trả lời khác cũng không phù hợp với tôi. – nealmcb

17

Hãy thử lệnh này:

grep -P '[^\x00-\x7f]' file 
+2

@JonasStein Vui lòng thêm tùy chọn '-P' (- perl-regex). – kev

+6

Lưu ý: tùy chọn '-P' không hoạt động trong BSD grep, đây là tùy chọn được chuyển trong OSX – nacho4d

+0

@ nacho4d Thay vào đó, người dùng có thể làm gì? –

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