У меня большой текстовый файл utf-8, с которым я часто ищу grep
. Недавно grep
начал сообщать, что это был бинарный файл. Я могу продолжить поиск с ним grep -a
, но мне было интересно, какие изменения заставили его решить, что файл теперь является двоичным.
У меня есть копия с прошлого месяца, где файл больше не определяется как двоичный файл, но для diff
них это не практично, поскольку они отличаются> 20 000 строк.
file
идентифицирует мой файл как
UTF-8 текст на английском языке Unicode, с очень длинными строками
Как я могу найти символы / линии / и т.д. в моем файле, которые вызывают это изменение?
Подобный, неповторяющийся вопрос 19907 охватывает возможность NUL, но grep -Pc '[\x00-\x1F]'
говорит, что у меня нет NUL или каких-либо других контрольных символов ANSI.
источник
nul
и некоторыеEsc
с. Я попытался найти их. Я мог найтиesc
s (\x1B
), но так иnul
не появился. Тест, приведенный выше, показал 1 для строки, содержащейEsc
s, но ничего для любого диапазона, который не содержал\x1B
. Я бы не стал доверять этому тесту. Попробуйтеgrep -zc .
вместо этого (должно быть на единицу больше, чем числоnul
s в вашем файле). (Кроме того, вы могли бы лучше использовать[[:cntrl:]]
.)sed -z 's/.*\(....\)$/\1/' foo | od -c
увидеть несколько символов передNUL
(если они есть), что может привести к проблеме.sed
не имеет-z
опции:sed: invalid option -- 'z'
.Ответы:
Похоже, что в файле присутствует нулевой символ (обычно отображается ^ @). Я ввел в текстовый файл различные управляющие символы (например, delete, ^?), И только нулевой символ заставил grep рассмотреть его. двоичный файл Это было проверено только на grep. Например, команды less и diff могут иметь разные методы. Управляющие символы обычно не отображаются, кроме как в двоичных файлах. Исключением являются пробельные символы: новая строка (^ M), табуляция (^ I), подача (^ L), вертикальная табуляция (^ K) и возврат (^ J).
Тем не менее, иностранные символы, такие как арабские или китайские буквы, не являются стандартными ascii, и, возможно, их можно спутать с управляющими символами. Возможно, поэтому это только нулевой символ.
Вы можете проверить это сами, вставив управляющие символы в текстовый файл с помощью текстового редактора vim. Просто перейдите в режим вставки, нажмите control-v, а затем управляющий символ.
источник
Типичная современная реализация grep должна объявлять файл «двоичным» только в том случае, если внутри него есть нулевые байты. Все остальное должно быть в порядке.
Я не могу говорить за реализацию grep, которую вы используете ...
источник
Ошибка кодирования согласно mbrlen () также заставляет GNU grep 2.24 считать его двоичным
Например:
потому что
\x80
не может быть первым байтом точки Unicode UTF-8: https://en.wikipedia.org/wiki/UTF-8#DescriptionЭто единственная другая возможность, кроме того
NUL
.grep
Интерпретация исходного кода GNU, которая приводит к такому выводу: что заставляет grep считать файл двоичным?источник