
多数のレコードを含むテキストファイルがあり、各レコードは1行を占めます。いくつかのレコードに破損した特殊文字があり、上記の複数の文字シーケンスを見つけてそれらを見つけようとします。x80
以下は、無効な文字が強調表示された1行の例です。
興味のある16進文字列は次のとおりです。
49 CC 80 C2 B9 6E
GNU Grepを使用すると、行grep --color='auto' -P -n "[\x80-\xFF]" record.txt
の一部のみが一致し、上付きの1(¹
)と一致しますが、次は一致しませんÌ
。
Grepは結合された文字+発音区別記号を分離できないようです...
私が望むのは、x80
2つ以上の連続した文字を含む行だけを保持し、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設定に割り当てられていないことを確認してください。