grep --color = auto com a opção -i desativa a cor do texto correspondente, por quê?

4

Eu estava brincando com grep e coloquei isso no meu .zshenv:

export GREP_OPTIONS="--color=auto"
export GREP_COLORS='mt=1;34'

Eu estava balançando minha cabeça no teclado e mudando GREP_COLORS por um minuto tentando descobrir por que as cores das pastas estavam funcionando, mas o texto correspondente não era.

Eu estava fazendo isso:

$ grep -R -n -i -e "functionFoo\(" --include=*.cs --exclude-dir=Logs *

O número da linha e os nomes dos arquivos foram definidos com as cores padrão, mas o texto correspondente não foi.

Depois de gastar muito tempo , pensei em fazer o seguinte:

$ grep -R -n -e "functionFoo\(" --include=*.cs --exclude-dir=Logs *

(eu removi a opção -i .) Isso foi o suficiente para que o texto correspondente fosse exibido corretamente em azul. Esta é uma configuração do Cygwin no Vista, com o rxvt executando o zsh.

Alguma idéia de porque as cores do grep iriam se quebrar ao especificar uma correspondência sem distinção entre maiúsculas e minúsculas?

Atualização: No cygwin 1.7, é um pouco melhor - a busca insensível a maiúsculas e minúsculas funciona corretamente, mas apenas destaca a palavra que corresponde exatamente à expressão. Em outras palavras, "FunctionFoo" destaca "FunctionFoo", mas não "functionFoo" e vice-versa. Provavelmente um problema com o grep, então vou enviá-lo para essa lista.

    
por emptyset 20.11.2009 / 21:12

2 respostas

1

Isso não está relacionado ao Cygwin, mas ao grep. Você precisa definir as variáveis de ambiente do código do idioma em seu shell, como LANG.

Extraído do manual do grep (1):

The locale for category LC_foo is specified by examining the three environment variables LC_ALL, LC_foo, LANG, in that order. The first of these variables that is set specifies the locale. For example, if LC_ALL is not set, but LC_MESSAGES is set to pt_BR, then the Brazilian Portuguese locale is used for the LC_MESSAGES category. The C locale is used if none of these environment variables are set, if the locale catalog is not installed, or if grep was not compiled with national language support (NLS).

Tente por exemplo:

LANG=en_US.UTF-8 grep -R -n -i -e "functionFoo\(" --include=*.cs --exclude-dir=Logs *

Isso deve resolver o seu problema, e funciona para mim com o GNU grep 2.5.4 e o bash 3.2.48 (1) -release.

    
por 02.05.2010 / 04:19
0

Eu tive esse mesmo problema usando o Msys MinGW. Não encontrei uma maneira de resolvê-lo, então acabei usando:

ack -i PATTERN

que faz cores e insensibilidade a maiúsculas e minúsculas corretamente.

    
por 08.08.2014 / 17:40