Как grep решает, что файл является двоичным?


8

У меня большой текстовый файл utf-8, с которым я часто ищу grep. Недавно grepначал сообщать, что это был бинарный файл. Я могу продолжить поиск с ним grep -a, но мне было интересно, какие изменения заставили его решить, что файл теперь является двоичным.

У меня есть копия с прошлого месяца, где файл больше не определяется как двоичный файл, но для diffних это не практично, поскольку они отличаются> 20 000 строк.

file идентифицирует мой файл как

UTF-8 текст на английском языке Unicode, с очень длинными строками

Как я могу найти символы / линии / и т.д. в моем файле, которые вызывают это изменение?


Подобный, неповторяющийся вопрос 19907 охватывает возможность NUL, но grep -Pc '[\x00-\x1F]'говорит, что у меня нет NUL или каких-либо других контрольных символов ANSI.


Я бы попробовал это в следующем порядке: 1. Запустите его с помощью strace / ltrace, чтобы проверить, какие входные данные вызывают это «двоичное» сообщение. 2. Проверьте источник grep и прочитайте его
ott--

@muru: я использую GNU grep, но если у вас есть ответ для какой-то другой версии, мне также будет интересно.
Чарльз

Странный. У меня есть файл, который я знаю, содержит nulи некоторые Escс. Я попытался найти их. Я мог найти escs ( \x1B), но так и nulне появился. Тест, приведенный выше, показал 1 для строки, содержащей Escs, но ничего для любого диапазона, который не содержал \x1B. Я бы не стал доверять этому тесту. Попробуйте grep -zc .вместо этого (должно быть на единицу больше, чем число nuls в вашем файле). (Кроме того, вы могли бы лучше использовать [[:cntrl:]].)
Муру

Также попробуйте: sed -z 's/.*\(....\)$/\1/' foo | od -cувидеть несколько символов перед NUL(если они есть), что может привести к проблеме.
Муру

@muru: My sedне имеет -zопции: sed: invalid option -- 'z'.
Чарльз

Ответы:


2

Похоже, что в файле присутствует нулевой символ (обычно отображается ^ @). Я ввел в текстовый файл различные управляющие символы (например, delete, ^?), И только нулевой символ заставил grep рассмотреть его. двоичный файл Это было проверено только на grep. Например, команды less и diff могут иметь разные методы. Управляющие символы обычно не отображаются, кроме как в двоичных файлах. Исключением являются пробельные символы: новая строка (^ M), табуляция (^ I), подача (^ L), вертикальная табуляция (^ K) и возврат (^ J).

Тем не менее, иностранные символы, такие как арабские или китайские буквы, не являются стандартными ascii, и, возможно, их можно спутать с управляющими символами. Возможно, поэтому это только нулевой символ.

Вы можете проверить это сами, вставив управляющие символы в текстовый файл с помощью текстового редактора vim. Просто перейдите в режим вставки, нажмите control-v, а затем управляющий символ.


2

Типичная современная реализация grep должна объявлять файл «двоичным» только в том случае, если внутри него есть нулевые байты. Все остальное должно быть в порядке.

Я не могу говорить за реализацию grep, которую вы используете ...


1

Ошибка кодирования согласно mbrlen () также заставляет GNU grep 2.24 считать его двоичным

Например:

export LC_CTYPE='en_US.UTF-8'
printf 'a\x80' | grep 'a'

потому что \x80не может быть первым байтом точки Unicode UTF-8: https://en.wikipedia.org/wiki/UTF-8#Description

Это единственная другая возможность, кроме того NUL.

grepИнтерпретация исходного кода GNU, которая приводит к такому выводу: что заставляет grep считать файл двоичным?

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.