Então "A." é a resposta simplesmente porque é o único que retorna as 2 funções definidas no código de exemplo:
$ grep -E "int[ \t]+\w+[ \t]*\([ \t]*int" sample.c
int double(int n)
int triple(int n, int other, char nonsense)
Os outros 3 não retornam nada, se você os tentar. Este funciona porque é capaz de lidar com as duas situações presentes nestas linhas:
int double(int n)
int triple(int n, int other, char nonsense)
O grep
:
-
int[ \t]+
- corresponde a linhas que começam comint
seguido por pelo menos 1 espaço ou tabulação (\t
) -
\w+
- corresponde a um ou mais caracteres em uma palavra (duplo e triplo) -
[ \t]*
- zero ou mais espaços ou tabulações -
\([ \t]*int
- um parents aberto ((
) seguido por zero ou mais espaços ou tabs seguidos pela stringint
OBSERVAÇÃO: a questão assume o GNU grep
, pois está utilizando \w
. Outras implementações de grep
não suportam essa notação com sua regex ( -E
), para estas, usar [[:alnum:]]
é a melhor escolha. Além disso, uma escolha mais sábia seria [[:blank:]]
em vez de [ \t]
, já que tecnicamente isso corresponde a espaços, barras invertidas e t como o POSIX requer.
Reescrevendo o "A" responda que esta é uma solução muito mais compatível:
$ grep -E "int[[:blank:]]+[[:alpha:]_][[:alnum:]_]+[[:blank:]]*\([[:blank:]]*int" sample.c
Aqui você pode ver em vermelho o que realmente correspondeu o grep
acima: