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