GrepはASCII以外の文字と一致しません。

GrepはASCII以外の文字と一致しません。

UTF-8でエンコードされたテキストファイルで疑われる問題のあるシーケンスが見つかりました。奇妙なことは、grepがASCII以外の行と一致しないようです。

$ iconv -f utf8 -t iso88591 corrupt_part.txt --output corrupt_part.txt.conv
iconv: illegal input sequence at position 8
$ cat corrupt_part.txt
Oberallg�u
$ grep -P -n '[^\x00-\x7F]' corrupt_part.txt
$ od -h corrupt_part.txt
0000000 624f 7265 6c61 676c 75e4 0a20
0000014

\xe4たとえば、ä拡張ASCIIセットでも同様です。ただし、フィルタリングコントロールと印刷可能文字(ASCII範囲)上記のgrepコマンドは\xe4この文字と一致する必要があります。なぜgrep出力が出ないのですか?

ベストアンサー1

e4 75実際には違法なutf8シーケンスです。 utf8では、最も高いニブルが0xeの3バイトシーケンスが導入されます。 2番目のバイトの上位ニブル(0x7)が0x8と0xbの間にないため、シーケンスの2番目のバイトは0x75にすることはできません。

これは、iconvがファイルを無効なutf8として拒否する理由を説明します。たぶんすでにiso8859-1でしょうか?

utf8エンコーディングの概要については、次を参照してください。ウィキペディアのテーブル

grep 質問の場合、C/POSIX ロケールを指定した場合、文字はバイトと同じになることがあります。

LC_ALL=C grep -P -n '[^\x00-\x7F]' corrupt_part.txt

古いUbuntuシステム、GNU grep、およびen_US.UTF-8ロケールを使用した環境の使用:

$ od -h bytes
0000000 624f 7265 6c61 676c 75e4 0a20
0000014
$ grep -P '[^\x00-\x7F]' bytes | od -h
0000000 624f 7265 6c61 676c 75e4 0a20
0000014
$ LC_ALL=C grep -P '[^\x00-\x7F]' bytes | od -h
0000000 624f 7265 6c61 676c 75e4 0a20
0000014

おすすめ記事