O que estou fazendo de errado com o grep?

1

O seguinte faz sentido (embora você não possa ver o conteúdo de debug.cpp).

$ grep '^[A-Za-z_]' debug.cpp
float CheckExistence();
entity Findgoal(float gno);
void RPrint(const string& msg);
void MakeMeDebug(entity who);
void dremove(entity te)
void display_location()
void RPrint(const string& msg)
void MakeMeDebug(entity who)

Agora, quando eu adiciono .* , como segue ...

$ grep '^[A-Za-z_].*' debug.cpp

Eu recebo 8 linhas em branco como resultado (o que não consigo fazer com que este site seja exibido). Suspeitando strongmente de um bug, atualizei para o mais recente grep (versão 2.25) e ele faz a mesma coisa. Eu estou usando o Ubuntu.

Se meu entendimento estiver correto, minha expressão regular diz: "Combine linhas começando com as letras de A a Z, sem distinção entre maiúsculas e minúsculas, ou sublinhado, seguido por qualquer coisa, incluindo nada."

Isso é um bug? Ou estou fazendo algo errado?

    
por Pulseczar 12.09.2016 / 17:31

1 resposta

3

Seu cpp está no formato DOS, ou seja, sua terminação de linha é feita por sequências \ r \ n e você tem um alias 'grep --color = auto' existente para o grep em sua sessão ao mesmo tempo. Esse alias coloca o terminal controlando as seqüências de escape ao redor da string correspondente. Se essa string for um caractere de palavra, ela não incomodará a saída no terminal. No entanto, se a string contiver um caractere de retorno de carro (\ r que corresponde ao último caractere de *), ele parece causar esse efeito colateral quando é cercado pelas seqüências.

Quando chamado usando --color = auto, o grep reconhece quando sua saída é enviada para pipe e então não colora a string, evitando assim o efeito colateral e aparecendo.

Depois de grep unaliasing, o fenômeno desaparece.

Para lhe dizer toda a verdade, isso não era algo óbvio, demorou um pouco para que me perguntasse por que a saída enviada para o arquivo está correta, mesmo quando uso o padrão mais longo, enquanto ele não mostra nada quando a saída vai para o terminal.

    
por 12.09.2016 / 22:09