2012-07-02 3 views
80

Wykonanie edycji strumienia w celu zmiany paskudnej ikony Parallels. Jest słabo rozwinięty i osadzony w samej aplikacji, a nie jako plik obrazu. Więc ja się tego sed polecenie, które ma kilka dobrych komentarzy:Uzyskiwanie "błędu sed - sekwencja niedozwolonych bajtów" (w bash)

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

zwraca sed: RE error: illegal byte sequence

Może ktoś wyjaśnić, co to oznacza? Jaka część polecenia jest problemem?

+0

Osoby pochodzące z Google: najpierw wypróbuj [tę odpowiedź] (http://stackoverflow.com/a/23523680/510036). Przychodzę do tego wątku więcej razy, niż chciałbym przyznać. – Qix

Odpowiedz

132

Spróbuj ustawić zmienną środowiskową (LANG=C sed ...LANG) lub użyć jednego z narzędzi binarnych sed wymienionych tutaj: binary sed replacement

Dlaczego błąd?

Bez LANG=C sed zakłada, że ​​pliki są kodowane w jakiejkolwiek kodowanie jest określony w LANG i plik (jako binarne) mogą zawierać bajtów, które nie są ważne postacie w LANG „kodowania s (w ten sposób można uzyskać«nielegalnej sekwencję bajtów»).

Dlaczego działa LANG=C?

C po prostu traktuje wszystkie znaki ASCII jako swoje i znaki spoza ASCII w postaci literałów.

+4

Jeśli 'shell' to twoja powłoka, możesz wpisać' export LANG = C' i spróbuj ponownie. – user664833

+18

Świetnie, ale użycie 'LC_ALL = C sed ...' jest bardziej niezawodnym podejściem: jeśli 'LC_ALL' lub' LC_CTYPE' są ustawione (na coś innego niż 'C'), ustawienie' LANG' nie będzie miało żadnego efektu. ('LC_ALL' _overrides_ wszystkie indywidualnie ustawione kategorie, jeśli takie istnieją, podczas gdy' LANG' działa tylko dla tych kategorii _nie_ jawnie ustawionych.) – mklement0

+3

Dla mnie 'LANG = C' nie działało ale' LC_ALL = C' zrobił – mreferre

63

sam nie załatwił sprawy, ale dodanie LC_CTYPE=C również rozwiązało problem.

+0

To samo dla mnie na OS X 10.8. Dzięki! – offner

+11

Efektywna_ wartość 'LC_CTYPE = C' jest wystarczająca do rozwiązania problemu:' LC_CTYPE = C sed ... '. Jednak to nie zadziała, jeśli ustawione jest 'LC_ALL' (na coś innego niż' C'), ponieważ owe _ nadpisuje_ wszystkie indywidualne kategorie 'LC_ *'. Dlatego najbardziej niezawodnym rozwiązaniem jest użycie 'LC_ALL = C sed ...'. – mklement0

16

udało mi się to zrobić uruchamiając:

unset LANG 

przed komendą sed.

Nie jestem pewien, co zrobiłem i dlaczego działa, ale tak się stało.

+0

Potrzebowałem wykonać powyższą poprawkę podczas wykonywania tego samouczka: http://projectpoppycock.com/angularjs-phonegap-and-angular-seed-lets-go/ – bulltorious

+0

To usuwa błąd, ale w rzeczywistości nic mi nie rozwiązuje. –

+1

Co do tego, dlaczego to działa: Jeśli twoje ustawienia narodowe były początkowo _set_ z '[export] LANG = ...' (w przeciwieństwie do ustawiania 'LC_ALL' lub ustawiania indywidualnie kategorii' LC_ * '), to wyłączenie' LANG' powoduje, że wszystkie '. LC_ * kategorie "cofają się do" "C" '; kończenie z 'LC_CTYPE' wartością' C' jest tym, co rozwiązuje problem. I odwrotnie, jeśli 'LC_ALL' lub nawet' LC_CTYPE' są ustawione na coś innego niż 'C', twoje podejście nie będzie działać. – mklement0

12

Oprócz LANG=C i LC_CTYPE=C musiałem wykonać LC_ALL=C, aby to zadziałało.

LC_ALL zastępuje wszystkie indywidualne kategorie LC_*. Dlatego najbardziej niezawodnym podejściem jest użycie LC_ALL=C sed ... - nie ma potrzeby zajmowania się innymi zmiennymi.

+0

wyjaśnij to troszkę więcej, proszę – rpax

+2

@rpax: Właściwie, efektywna wartość 'LC_CTYPE' C jest wystarczająca, więc użycie' LC_CTYPE = C sed ... '(bezpośrednio poprzedzające komendę urazu) jest wystarczające, _niemniejsze' 'LC_ALL' - które _przekłada_ wszystkie indywidualne kategorie "LC_ *" - zostało ustawione. Dlatego najbardziej niezawodnym rozwiązaniem jest użycie 'LC_ALL = C sed ...' - nie ma potrzeby zajmowania się innymi zmiennymi. – mklement0

+0

To powinna być zaakceptowana odpowiedź. Mam nadzieję, że nie masz nic przeciwko, że zredagowałem komentarz @ mklement0 do odpowiedzi. – Qix