2011-11-15 25 views
17

Tôi chỉ phát hiện ra rằng nếu tôi tiền tố lệnh grep của tôi với một LC_ALL = C nó làm kỳ diệu cho tăng tốc grep lên.Ý nghĩa của LC_ALL = C để tăng tốc grep

Nhưng tôi tự hỏi về những tác động.

Mẫu có sử dụng UTF-8 không khớp không? Điều gì sẽ xảy ra nếu tệp được grepped đang sử dụng UTF-8?

+1

Phiên bản grep nào? Có một lỗi UTF khó chịu ở đâu đó trước 2.7.1 hoặc 2.7.3. Tôi giả sử grep GNU của nó, BSD grep luôn luôn chậm. – dfc

Trả lời

17

Bạn không nhất thiết cần UTF-8 để gặp sự cố tại đây. Miền địa phương chịu trách nhiệm thiết lập các lớp nhân vật, tức là xác định ký tự nào là dấu cách, chữ cái hoặc chữ số. Hãy xem xét hai ví dụ này:

$ echo -e '\xe4' | LC_ALL=en_US.iso88591 grep '[[:alnum:]]' || echo false 
ä 
$ echo -e '\xe4' | LC_ALL=C grep '[[:alnum:]]' || echo false 
false 

Khi cố gắng để phù hợp với mô hình nhị phân chính xác với nhau, miền địa phương không tạo sự khác biệt, tuy nhiên:

$ echo -e '\xe4' | LC_ALL=en_US.iso88591 grep "$(echo -e '\xe4')" || echo false 
ä 
$ echo -e '\xe4' | LC_ALL=C grep "$(echo -e '\xe4')" || echo false 
ä 

Tôi không chắc chắn về mức độ grep thực hiện unicode và các điểm mã khác nhau được khớp với nhau như thế nào, nhưng khớp với bất kỳ tập hợp con nào của ASCII và khớp với các ký tự đơn không có biểu diễn nhị phân thay thế sẽ hoạt động tốt bất kể miền địa phương.

+1

Vì vậy, nếu tôi đọc quyền này: các tập tin để grep & danh sách các mẫu chỉ chứa ký tự ascii, mọi thứ sẽ ổn? – elhoim

+1

Có, bạn sẽ ổn với ASCII thuần túy. Ít nhất là trong thực tế, như trong lý thuyết nó có thể là EBCDIC. –

+0

'|| 'là gì? một số loại tuyên bố nếu? – Thorn