web-dev-qa-db-ja.com

REエラー:Mac OS Xでの不正なバイトシーケンス

Mac OS XでMakefileの文字列を置き換えて、iOSにクロスコンパイルしようとしています。文字列には二重引用符が埋め込まれています。コマンドは次のとおりです。

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

エラーは次のとおりです。

sed: RE error: illegal byte sequence

二重引用符、コンマ、ダッシュ、コロンを喜びなくエスケープしようとしました。例えば:

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

私は問題のデバッグにかなりの時間を費やしています。誰でもsedを取得して不正なバイトシーケンスの位置を出力する方法を知っていますか?または、不正なバイトシーケンスが何であるかを知っていますか?

152
jww

~/.bash_profileまたは~/.zshrcファイルに次の行を追加します。

export LC_CTYPE=C 
export LANG=C
125

私の回避策はPerlを使用していた:

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

mklement0の答え は素晴らしいですが、いくつかの小さな調整があります。

bashを使用する場合は、iconvのエンコードを明示的に指定することをお勧めします。また、バイトオーダーマークを追加する必要があります( nicode標準では推奨していませんがTF-8とASCIIの間に正当な混乱が生じる可能性があるため) _バイト順マークなし 。残念ながら、iconvは、エンディアン(UTF-16BEまたはUTF-16LE)を明示的に指定するときに、バイト順マークを付加しません。そのため、プラットフォームを使用するUTF-16を使用する必要があります固有のエンディアンネスを使用し、file --mime-encodingを使用して、使用されている真のエンディアンネスiconvを検出します。

iconvでサポートされているすべてのエンコーディングをiconv -lでリストすると、すべて大文字になるため、すべてのエンコーディングを大文字にします。)

# 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

sedコマンドの前にiconvコマンドをパイプするだけです。 file.txtを入力した例:

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

-fオプションは「from」コードセットで、-tオプションは「to」コードセット変換です。

大文字と小文字を区別して、Webページは通常<charset = iso-8859-1 "/>のような小文字を表示し、iconvは大文字を使用します。iconvサポートされるコードセットのリストはコマンドiconv -lを使用してシステム

TF8-MACは、変換用の最新のOS Macコードセットです。

私の回避策はgnu sedを使用していた。私の目的のためにうまく働いた。

0
lu_zero