Eu tenho um grande arquivo de texto utf-8 com o qual pesquiso frequentemente grep
. Recentemente, grep
começou a relatar que era um arquivo binário. Posso continuar pesquisando grep -a
, mas fiquei imaginando com que alteração decidi que o arquivo agora era binário.
Eu tenho uma cópia do mês passado em que o arquivo não é mais detectado como binário, mas não é prático para diff
eles, pois eles diferem em> 20.000 linhas.
file
identifica meu arquivo como
Texto em UTF-8 Unicode em inglês, com linhas muito longas
Como posso encontrar os caracteres / linhas / etc. no meu arquivo que está acionando essa alteração?
A pergunta similar, não duplicada, 19907, cobre a possibilidade de NUL, mas grep -Pc '[\x00-\x1F]'
diz que eu não tenho NUL ou quaisquer outros chaarcters de controle ANSI.
fonte
nul
e algunsEsc
s. Eu tentei grepping para eles. Eu consegui encontrar oesc
s (\x1B
), mas onul
nunca apareceu. O teste acima mostrou 1, para a linha que contémEsc
s, mas nada para qualquer faixa que não contenha\x1B
. Eu não confiaria nesse teste. Tente emgrep -zc .
vez disso (deve ser um a mais que o número denul
s no seu arquivo). (Além disso, você pode ser melhor fora de usar[[:cntrl:]]
.)sed -z 's/.*\(....\)$/\1/' foo | od -c
ver alguns caracteres antes doNUL
(se houver), o que pode levar você ao problema.sed
não tem uma-z
opção:sed: invalid option -- 'z'
.Respostas:
Parece ser a presença do caractere nulo no arquivo. (Exibido ^ @ normalmente) Digitei vários caracteres de controle em um arquivo de texto (como excluir, ^ ?, por exemplo), e apenas o caractere nulo fez com que o grep o considerasse um binário. Isso foi testado apenas para grep. Os comandos less e diff, por exemplo, podem ter métodos diferentes. Os caracteres de controle em geral não aparecem, exceto nos binários. As exceções são os caracteres de espaço em branco: nova linha (^ M), guia (^ I), avanço de página (^ L), guia vertical (^ K) e retorno (^ J).
No entanto, caracteres estrangeiros, como letras árabes ou chinesas, não são ascii padrão e talvez possam ser confundidos com caracteres de controle. Talvez seja por isso que é apenas o caractere nulo.
Você pode testá-lo inserindo caracteres de controle em um arquivo de texto usando o editor de texto vim. Vá para o modo de inserção, pressione control-v e, em seguida, o caractere de controle.
fonte
Uma implementação típica do grep moderno só deve declarar um arquivo "binário" se houver nul bytes dentro. Qualquer outra coisa deve ficar bem.
Não posso falar pela implementação grep que você usa ...
fonte
Um erro de codificação de acordo com mbrlen () também faz com que o GNU grep 2.24 o considere binário
Por exemplo:
porque
\x80
não pode ser o primeiro byte de um ponto Unicode UTF-8: https://en.wikipedia.org/wiki/UTF-8#DescriptionEssa é a única outra possibilidade além disso
NUL
.grep
Interpretação do código fonte GNU que leva a esta conclusão: O que faz o grep considerar um arquivo como binário?fonte