
大量のレコードが1行にまとめられたテキストファイルがあります。レコードの中には破損した特殊文字が含まれているものもあり、それを見つけるために、128文字以上の文字列を複数回検索しています。x80
以下は、誤った文字が強調表示された 1 行のサンプルです。
対象となる 16 進文字列は次のとおりです。
49 CC 80 C2 B9 6E
GNU Grep を使用すると、grep --color='auto' -P -n "[\x80-\xFF]" record.txt
行の一部にしか一致しません。上付き文字 1 ( ¹
) には一致しますが、Ì
:には一致しません。
Grep は、結合された文字と分音記号を分割できないようです...
私がやりたいのは、2 つ以上の連続したx80
文字を含む行だけを保持し、16 進コードに表示される実際の文字と一致できるようにすることです。つまり、49 CC 80 C2 B9 6E
次のようなものと一致するはずです"[\x80-\xFF]{2,10}"
が、この一致は機能しません。
つまり、これを使用すると、行は次のようになります。
grep --color='auto' -P -n "[\x80-\xFF]" record.txt
しかし、これを使用すると、次のことが起こりません。
grep --color='auto' -P -n "[\x80-\xFF]{2,10}" record.txt
バイトシーケンスが であり、CC 80 C2 B9
値が である連続する 4 バイトの文字列であるため、2 番目も一致するはずではありませんかx80-xFF
?
答え1
これはロケールに関連している可能性があります。その場合、文字がバイトである C (別名 POSIX) ロケールを使用すると機能する可能性があります。
LC_ALL=C grep --color='auto' -P -n "[\x80-\xFF]{2,10}" record.txt
答え2
Grep は奇妙な文字があると不安定になることがあります。次を試してください:
grep --color='auto' -P -n "[\x80-\xFF]" record.txt | iconv -f utf-16 -t utf-16
文字は元に戻るかもしれませんが、色は失われます。utf-16 と utf-8 をいじってみる価値はあるかもしれません。
また、コンソールが uft-8 を処理できること、および何らかの ANSI 設定に割り当てられていないことを確認してください。