2012-07-02 3 views
80

Tuning einige Stream-Bearbeitung, um die böse Parallels-Symbol zu ändern. Es ist schlecht entwickelt und in die App selbst eingebettet, anstatt eine Bilddatei zu sein. Also habe ich diesen sed Befehl befindet, die etwas gutes Feedback hat:Get "sed Fehler - illegale Byte-Sequenz" (in bash)

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

Es gibt sed: RE error: illegal byte sequence

Kann mir jemand erklären, was das bedeutet? Welcher Teil des Befehls ist das Problem?

+0

Die von Google kommen: versuchen Sie [diese Antwort] (http://StackOverflow.com/a/23523680/510036) zuerst. Ich komme öfter zu diesem Thread, als ich zugeben möchte. – Qix

Antwort

132

Versuchen Sie, die LANG Umgebungsvariable (LANG=C sed ...) oder hier erwähnt eine der binären sed-Tools verwenden: binary sed replacement

Warum der Fehler?

Ohne LANG=C sed geht davon aus, dass die Dateien in codiert sind, was auch immer Codierung in LANG angegeben wird und die Datei (binär ist) enthalten können Bytes, die keine gültigen Zeichen in LANG sind illegal Bytefolge ‚s-Codierung (also Sie bekommen konnte‚‘).

Warum funktioniert LANG=C?

C behandelt zufällig alle ASCII-Zeichen als sich selbst und Nicht-ASCII-Zeichen als Literale.

+4

Wenn 'bash' Ihre Shell ist, können Sie' export LANG = C' eingeben und es erneut versuchen. – user664833

+18

Großartig, aber 'LC_ALL = C sed ...' ist der robustere Ansatz: Wenn 'LC_ALL' oder' LC_CTYPE' gesetzt sind (auf etwas anderes als 'C'), hat die Einstellung' LANG' keine Wirkung. ('LC_ALL' _overrides_ alle individuell eingestellten Kategorien, wenn vorhanden, während' LANG' nur für diese Kategorien gilt _nicht_ explizit gesetzt.) – mklement0

+3

Für mich funktionierte 'LANG = C' nicht, aber' LC_ALL = C' tat – mreferre

63

LANG=C allein hat nicht den Trick für mich getan, aber LC_CTYPE=C hinzugefügt und löste es auch.

+0

Selbe für mich auf OSX 10.8. Vielen Dank! – offner

+11

Ein _effective_ Wert von 'LC_CTYPE = C' reicht aus, um das Problem zu lösen:' LC_CTYPE = C sed ... '. Dies wird jedoch nicht funktionieren, wenn 'LC_ALL' gesetzt ist (auf etwas anderes als' C'), weil das _alle_ 'LC_ *' Kategorien übersteuert. Daher ist der robusteste Ansatz, 'LC_ALL = C sed ...' zu verwenden. – mklement0

16

Ich schaffte es durch Laufen zu tun:

unset LANG 

vor dem sed Befehl.

Nicht sicher, was ich getan habe oder warum es funktioniert, aber es tat.

+0

Ich musste den obigen Fix tun, wenn ich diesem Tutorial folge: http://projectpoppycock.com/angularjs-phonegap-and-angular-see-lets-go/ – bulltorious

+0

Das entfernt den Fehler, aber löst eigentlich nichts für mich. –

+1

Warum es funktioniert: Wenn Ihr Gebietsschema anfänglich _set_ mit '[export] LANG = ...' war (im Gegensatz zur Einstellung von 'LC_ALL' oder' LC_ * 'Kategorien einzeln einstellen), macht' 'LANG'' alle 'unscharf LC_ * 'Kategorien kehren zu' "C" 'zurück; Am Ende steht ein "LC_CTYPE" -Wert von "C", der das Problem löst. Umgekehrt, wenn 'LC_ALL' oder sogar' LC_CTYPE' speziell auf etwas anderes als 'C' gesetzt sind, funktioniert Ihr Ansatz nicht. – mklement0

12

Zusätzlich zu LANG=C und LC_CTYPE=C musste ich LC_ALL=C tun, um dies zu arbeiten.

LC_ALL überschreibt alle individuellen LC_* Kategorien. Daher ist der robusteste Ansatz die Verwendung LC_ALL=C sed ... - keine Notwendigkeit, auch mit den anderen Variablen umzugehen.

+0

erkläre es ein bisschen mehr, bitte – rpax

+2

@rpax: Tatsächlich ist ein effektiver 'LC_CTYPE'-Wert von C ausreichend, also ist die Verwendung von' LC_CTYPE = C sed ... '(direkt vor dem fehlerhaften Befehl) _normalerweise ausreichend _unless_' LC_ALL' - was _overrides_ alle einzelnen 'LC_ *' Kategorien - wurde gesetzt. Daher ist der robusteste Ansatz, 'LC_ALL = C sed ...' zu verwenden - keine Notwendigkeit, auch mit den anderen Variablen umzugehen. – mklement0

+0

Dies sollte die akzeptierte Antwort sein. Ich hoffe, es macht Ihnen nichts aus, ich habe den Kommentar von @ mklement0 in die Antwort geändert. – Qix