Как выполнить двоичный поиск в текстовом файле определенной строки символов?

Как выполнить двоичный поиск в текстовом файле определенной строки символов?

У меня есть текстовый файл, содержащий большое количество записей, каждая из которых находится на одной строке. Некоторые записи содержат специальные символы, которые были повреждены, и я пытаюсь найти их, просматривая несколько последовательностей символов выше, чемx80

Вот пример одной строки с выделенными неправильными символами:

введите описание изображения здесь

Интересующая нас шестнадцатеричная строка:

49 CC 80 C2 B9 6E

При использовании GNU Grep grep --color='auto' -P -n "[\x80-\xFF]" record.txtон находит только часть строки, а именно верхний индекс 1 ( ¹), но не Ì:

введите описание изображения здесь

Похоже, Grep не может разбить комбинацию символ+диакритический знак на части...

Мне бы хотелось сохранить только те строки, которые содержат два или более последовательных x80символа, и иметь возможность сопоставлять реальные символы, которые отображаются в шестнадцатеричном коде, то есть, 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 последовательных байтов со значениями 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.

Связанный контент