テキスト ファイルで特定の文字列をバイナリ検索するにはどうすればよいですか?

テキスト ファイルで特定の文字列をバイナリ検索するにはどうすればよいですか?

大量のレコードが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 設定に割り当てられていないことを確認してください。

関連情報