Como o grep decide que um arquivo é binário?

7

Eu tenho um arquivo de texto utf-8 grande que eu pesquiso com frequência com grep . Recentemente grep começou a relatar que era um arquivo binário. Eu posso continuar pesquisando com grep -a , mas fiquei me perguntando qual alteração fez com que ele decidisse 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 , pois eles diferem em > 20.000 linhas.

file identifica meu arquivo como

UTF-8 Unicode English text, with very long lines

Como posso encontrar os caracteres / linhas / etc. no meu arquivo que estão provocando essa mudança?

A pergunta semelhante e não duplicada 19907 abrange a possibilidade de NUL, mas grep -Pc '[\x00-\x1F]' diz que não 't tem NUL ou qualquer outro controle ANSI.

    
por Charles 17.09.2015 / 22:40

3 respostas

2

Parece ser a presença do caractere nulo no arquivo. (exibido ^ @ geralmente) Eu inseri vários caracteres de controle em um arquivo de texto (como delete, ^?, Por exemplo), e apenas o caractere nulo fez com que o grep o considerasse um binário. Isso só foi testado para o grep. Os comandos less e diff, por exemplo, podem ter métodos diferentes. Caracteres de controle em geral não aparecem exceto em binários. As exceções são os caracteres de espaço em branco: nova linha (^ M), tabulação (^ I), formfeed (^ L), tabulação 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 os caracteres de controle em um arquivo de texto usando o editor de texto vim. Basta ir para o modo de inserção, pressione control-v e, em seguida, o caractere de controle.

    
por 17.09.2015 / 23:30
2

Uma implementação grep moderna típica deve apenas declarar um arquivo "binário" se houver bytes nulos dentro dele. Qualquer outra coisa deve ser OK.

Eu não posso falar pela implementação do grep que você usa ...

    
por 18.09.2015 / 00:10
1

Um erro de codificação de acordo com mbrlen () também faz com que o GNU grep 2.24 o considere como binário

Por exemplo:

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

porque \x80 não pode ser o primeiro byte de um ponto Unicode UTF-8: link

Esta é a única outra possibilidade além de NUL .

Interpretação do código-fonte GNU grep que leva a esta conclusão: O que faz o grep considerar que um arquivo é binário?

    
por 12.04.2016 / 22:55