2012-07-02 21 views
80

Thực hiện một số chỉnh sửa luồng để thay đổi biểu tượng Parallels khó chịu. Nó phát triển kém và được nhúng vào chính ứng dụng chứ không phải là tệp hình ảnh. Vì vậy, tôi đã nằm lệnh sed này có một số thông tin phản hồi tốt:Nhận "lỗi nghiêm trọng - chuỗi byte bất hợp pháp" (trong bash)

sudo sed -i.bak s/Parallels_Desktop_Overlay_128/Parallels_Desktop_Overlay_000/g /Applications/Parallels\ Desktop.app/Contents/MacOS/prl_client_app 

Nó trả sed: RE error: illegal byte sequence

thể bất cứ ai giải thích điều này có nghĩa? Phần nào của lệnh là vấn đề?

+0

Những người đến từ Google: trước tiên hãy thử [câu trả lời này] (http://stackoverflow.com/a/23523680/510036). Tôi đến chủ đề này nhiều lần hơn tôi muốn thừa nhận. – Qix

Trả lời

132

Hãy thử thiết lập biến môi trường LANG (LANG=C sed ...) hoặc sử dụng một trong những công cụ sed nhị phân đề cập ở đây: binary sed replacement

Tại sao lỗi?

Without LANG=C sed giả định rằng tập tin được mã hóa dưới bất kỳ mã hóa được quy định tại LANG và tập tin (là nhị phân) có thể chứa byte không phải là ký tự hợp lệ trong LANG 'mã hóa s (do đó bạn có thể nhận 'chuỗi byte bất hợp pháp').

Tại sao LANG=C hoạt động?

C chỉ xảy ra để xử lý tất cả các ký tự ASCII như chính chúng và các ký tự không phải ASCII dưới dạng chữ.

+4

Nếu 'bash' là shell của bạn, bạn có thể nhập' export LANG = C' và thử lại. – user664833

+18

Tuyệt vời, nhưng sử dụng 'LC_ALL = C sed ...' là cách tiếp cận mạnh mẽ hơn: nếu 'LC_ALL' hoặc' LC_CTYPE' được đặt (thành cái gì đó khác 'C'), cài đặt' LANG' sẽ không có hiệu lực. ('LC_ALL' _overrides_ tất cả các danh mục được thiết lập riêng lẻ, nếu có, trong khi' LANG' chỉ có hiệu lực đối với các danh mục _not_ được đặt rõ ràng.) – mklement0

+3

Với tôi 'LANG = C' không hoạt động nhưng' LC_ALL = C' đã làm – mreferre

63

LANG=C một mình đã không thực hiện thủ thuật cho tôi nhưng thêm LC_CTYPE=C cũng đã giải quyết được.

+0

Tương tự với tôi trên OSX 10.8. Cảm ơn! – offner

+11

Giá trị _effective_ của 'LC_CTYPE = C' là đủ để giải quyết vấn đề:' LC_CTYPE = C sed ... '. Tuy nhiên, điều đó sẽ không hoạt động nếu 'LC_ALL' được đặt (thành một cái gì đó khác với' C'), bởi vì _overrides_ tất cả các danh mục 'LC_ *' riêng lẻ. Do đó, cách tiếp cận mạnh mẽ nhất là sử dụng 'LC_ALL = C sed ...'. – mklement0

16

tôi cố gắng làm điều đó bằng cách chạy:

unset LANG 

trước khi lệnh sed.

Không chắc chắn những gì tôi đã làm hoặc lý do tại sao nó hoạt động nhưng nó đã làm.

+0

Tôi cần thực hiện khắc phục ở trên khi làm theo hướng dẫn này: http://projectpoppycock.com/angularjs-phonegap-and-angular-seed-lets-go/ – bulltorious

+0

Điều này sẽ xóa lỗi, nhưng thực sự không giải quyết được gì cho tôi. –

+1

Đối với lý do tại sao nó hoạt động: Nếu ngôn ngữ của bạn ban đầu là _set_ với '[export] LANG = ...' (trái ngược với thiết lập 'LC_ALL' hoặc thiết lập' LC_ * 'loại riêng lẻ), sau đó unsetting' LANG' làm cho tất cả ' LC_ * 'loại hoàn nguyên về' "C" '; kết thúc bằng giá trị 'LC_CTYPE' của' C' là cách giải quyết vấn đề. Ngược lại, nếu 'LC_ALL' hoặc thậm chí' LC_CTYPE' cụ thể được đặt thành một cái gì đó khác với 'C', cách tiếp cận của bạn sẽ không hoạt động. – mklement0

12

Ngoài LANG=CLC_CTYPE=C, tôi phải làm LC_ALL=C để làm điều này hoạt động.

LC_ALL ghi đè tất cả cá nhân LC_* danh mục. Do đó, cách tiếp cận mạnh mẽ nhất là sử dụng LC_ALL=C sed ... - không cần phải xử lý các biến khác.

+0

giải thích nó nhiều hơn một chút, vui lòng – rpax

+2

@rpax: Thực ra, giá trị 'LC_CTYPE' hiệu dụng của C là đủ, do đó, sử dụng' LC_CTYPE = C sed ... '(trực tiếp thêm vào lệnh vi phạm) là _normally_ đủ, _unless_' LC_ALL' - _overrides_ tất cả các danh mục 'LC_ *' riêng lẻ - đã được đặt. Do đó, cách tiếp cận mạnh mẽ nhất là sử dụng 'LC_ALL = C sed ...' - không cần phải xử lý các biến khác. – mklement0

+0

Đây phải là câu trả lời được chấp nhận. Hy vọng bạn không nhớ, tôi đã chỉnh sửa nhận xét của @ mklement0 về câu trả lời. – Qix

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