Usando o grep para encontrar todas as substrings de strings que podem conter caracteres especiais

3

Estou tentando usar o grep para encontrar a string "crk" em um arquivo. Eu sei que a string existe em um arquivo de origem c na forma

kop.crk_op = CRK_MOD_EXP;

No entanto, quando eu procuro usando

 grep -rnw --include '*.c' '.' -e "crk"

Eu recebo um resultado vazio. A linha

 grep -rnw --include '*.c' '.' -e "crk_op"

funciona muito bem, mas isso realmente não é útil para mim. Eu suponho que o caractere '_' está de alguma forma atrapalhando a minha pesquisa. Como posso modificar minha abordagem para corresponder a todas as strings das quais "crk" é uma substring, mesmo quando o caractere '_' está presente ou qualquer outro caractere para esse assunto?

Edit: Parece que fiquei um pouco feliz com este post. O comando

grep -rnw --include '*.c' '.' -e "[^ ]*crk[^ ]*"

parece funcionar. Como alternativa, alguém pode explicar por que os curingas extras são necessários?

    
por Aroto 05.04.2017 / 07:31

1 resposta

2

A opção -w faz com que o grep procure palavras, portanto, ele mostrará crk quando estiver cercado por caracteres que não sejam de palavras. De man grep :

-w, --word-regexp
      Select  only  those  lines  containing  matches  that form whole
      words.  The test is that the matching substring must  either  be
      at  the  beginning  of  the  line,  or  preceded  by  a non-word
      constituent character.  Similarly, it must be either at the  end
      of  the  line  or  followed by a non-word constituent character.
      Word-constituent  characters  are  letters,  digits,   and   the
      underscore.

_ é um caractere de palavra, por isso, crk_op não corresponderá a crk com -w .

A regex complicada "[^ ]*crk[^ ]*" funciona porque permite qualquer número de caracteres não-espaciais entre os limites de palavras que o grep requer.

Basta fazer:

grep -rn --include '*.c' . -e crk

Você não precisa qoute . para o diretório atual lá.

    
por muru 05.04.2017 / 07:36