Por que um LANG = C explícito é requerido ao procurar representações hexadecimais de caracteres no grep?

0

Quando eu quero pesquisar recursivamente arquivos TeX para caracteres não suportados pela minha fonte, normalmente inicio com uma busca por espaços não quebráveis e espaços de largura zero. Estes são difíceis de produzir na linha de comando do terminal, portanto eu uso suas representações hexadecimais UTF-8.

env LANG=C grep -obUaP "\xc2\xa0" $(find -name '*.tex')
env LANG=C grep -obUaP "\xe2\x80\x8b" $(find -name '*.tex')

Por que preciso definir explicitamente a variável de ambiente LANG como C , conforme mostrado acima: env LANG=C

Notas

Usar -U e -a simultaneamente pode parecer errado, mas esta versão do manual afirma que

When type is ‘binary’, grep may treat non-text bytes as line terminators even without the -z (--null-data) option.

-a força apenas terminadores de linha a serem terminadores de linha (não tão claros).

link

    
por Jonathan Komar 04.10.2017 / 14:20

1 resposta

0

Minha versão do manual do grep não inclui isso, mas o grep 3.0 elabora esse tópico.

Warning: The -a (--binary-files=text) option might output binary garbage, which can have nasty side effects if the output is a terminal and if the terminal driver interprets some of it as commands. On the other hand, when reading files whose text encodings are unknown, it can be helpful to use -a or to set ‘LC_ALL='C'’ in the environment, in order to find more matches even if the matches are unsafe for direct display.

A partir desta resposta: link

In the C locale, characters are single bytes, the charset is ASCII [...]

Esse provavelmente é o motivo pelo qual isso ajuda na exibição de caracteres ao verificar arquivos de texto desconhecidos. Força um conjunto de caracteres ASCII.

    
por 05.10.2017 / 09:01