it-swarm.com.de

RE-Fehler: Unzulässige Bytefolge unter Mac OS X

Ich versuche, eine Zeichenfolge in einem Makefile unter Mac OS X für das Cross-Compilieren auf iOS zu ersetzen. Die Zeichenfolge enthält doppelte Anführungszeichen. Der Befehl lautet:

sed -i "" 's|"iphoneos-cross","llvm-gcc:-O3|"iphoneos-cross","clang:-Os|g' Configure

Und der Fehler ist:

sed: RE error: illegal byte sequence

Ich habe versucht, die doppelten Anführungszeichen, Kommas, Gedankenstriche und Doppelpunkte ohne Freude zu umgehen. Zum Beispiel:

sed -i "" 's|\"iphoneos-cross\"\,\"llvm-gcc\:\-O3|\"iphoneos-cross\"\,\"clang\:\-Os|g' Configure

Ich habe verdammt viel Zeit, um das Problem zu beheben. Weiß jemand, wie man sed erhält, um die Position der unzulässigen Bytesequenz zu drucken? Oder weiß jemand, was die unzulässige Bytefolge ist?

156
jww

Fügen Sie die folgenden Zeilen zu Ihrem ~/.bash_profile oder ~/.zshrc Datei (en).

export LC_CTYPE=C 
export LANG=C
126

Mein Workaround war Perl:

find . -type f -print0 | xargs -0 Perl -pi -e 's/was/now/g'
3

mklement0s Antwort ist großartig, aber ich habe ein paar kleine Verbesserungen.

Es scheint eine gute Idee zu sein, die Kodierung von bash explizit anzugeben, wenn iconv verwendet wird. Außerdem sollten wir eine Markierung in der Reihenfolge der Bytes voranstellen ( obwohl der Unicode-Standard dies nicht empfiehlt ), da es legitime Verwechslungen zwischen UTF-8 und ASCII ohne ein Byte-Order-Zeichen Leider stellt iconv kein Byte-Order-Zeichen voran, wenn Sie explizit eine Endianness (UTF-16BE oder UTF-16LE), also müssen wir UTF-16 verwenden, das plattformspezifische Endianness verwendet, und dann file --mime-encoding verwenden, um die wahre Endianness iconv zu ermitteln.

(Ich schreibe alle meine Kodierungen in Großbuchstaben, da alle von iconv unterstützten Kodierungen mit iconv -l In Großbuchstaben angegeben werden.)

# Find out MY_FILE's encoding
# We'll convert back to this at the end
FILE_ENCODING="$( file --brief --mime-encoding MY_FILE )"
# Find out bash's encoding, with which we should encode
# MY_FILE so sed doesn't fail with 
# sed: RE error: illegal byte sequence
BASH_ENCODING="$( locale charmap | tr [:lower:] [:upper:] )"
# Convert to UTF-16 (unknown endianness) so iconv ensures
# we have a byte-order mark
iconv -f "$FILE_ENCODING" -t UTF-16 MY_FILE > MY_FILE.utf16_encoding
# Whether we're using UTF-16BE or UTF-16LE
UTF16_ENCODING="$( file --brief --mime-encoding MY_FILE.utf16_encoding )"
# Now we can use MY_FILE.bash_encoding with sed
iconv -f "$UTF16_ENCODING" -t "$BASH_ENCODING" MY_FILE.utf16_encoding > MY_FILE.bash_encoding
# sed!
sed 's/.*/&/' MY_FILE.bash_encoding > MY_FILE_SEDDED.bash_encoding
# now convert MY_FILE_SEDDED.bash_encoding back to its original encoding
iconv -f "$BASH_ENCODING" -t "$FILE_ENCODING" MY_FILE_SEDDED.bash_encoding > MY_FILE_SEDDED
# Now MY_FILE_SEDDED has been processed by sed, and is in the same encoding as MY_FILE
3
Heath Borders

Sie müssen lediglich einen iconv - Befehl vor dem sed - Befehl einfügen. Ex mit file.txt Eingabe:

iconv -f ISO-8859-1 -t UTF8-MAC-Datei.txt | sed 's/something/àéèêçùû/g' | .....

- f Option ist der Code-Satz "von" und -t Option ist die Code-Satz-Konvertierung "zu".

Achten Sie auf die Groß- und Kleinschreibung. Webseiten zeigen normalerweise Kleinbuchstaben wie <charset = iso-8859-1 "/> und iconv verwendet Großbuchstaben. Sie haben eine Liste von iconv unterstützten Codesätzen in Sie systemieren mit dem Befehl iconv -l

TF8-MAC ist ein moderner Mac-Codesatz für die Konvertierung.

Meine Problemumgehung hatte gnu sed verwendet. Funktionierte gut für meine Zwecke.

0
lu_zero