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 comintseguido 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: