2017-05-16 1 views
0

j'ai utilisé grep -F -e "function1" --include=*.{cpp,c} . -r -n pour trouver l'utilisation de function1 mais réalisé que je pouvais accélérer alors j'ai enlevé c de --include mais alors ça ne marche pas.grep --include = *. {Cpp, cc, cxx} ne fonctionne pas s'il n'y a qu'une seule entrée entre parenthèses

Pourquoi?

Cela ne fonctionne pas ->grep -F -e "function1" --include=*.{cpp} . -r -n

Il va courir, mais ne retournera rien. Si j'ajoute un deuxième élément, c'est-à-dire --include=*.{cpp,dsafjlsadfsaldf}, alors cela fonctionne.

+0

Il s'agit d'une fonctionnalité shell, non spécifique à 'grep'. Puisque vous avez déjà tagué [gnu], j'ai ajouté [bash]. –

+1

'*. {Cpp, c}' est développé en '* .cpp * .c' alors que' *. {Cpp} 'est toujours' *. {Cpp} '. – alvits

Répondre

2

Vous comptez sur "l'expansion des accolades" du shell fonctionnalité. Pour citer le manuel bash,

Un développement des accolades correctement formé doit contenir ouverture unquoted et entretoises de fermeture, et au moins une virgule non indiquée ou une expression de séquence valide.

Sans aucune virgule, le texte n'est pas éligible pour l'expansion de l'accolade.

1

Observe:

$ echo {a,b} 
a b 
$ echo {a} 
{a} 

En d'autres termes, expansion des accolades ne fonctionne que s'il y a deux autres éléments dans les accolades. Si vous n'avez qu'un seul élément, n'utilisez pas d'accolades.

Encore une fois, mais aborder les options spécifiques que vous utilisez:

$ echo --include=*.{cpp,c} 
--include=*.cpp --include=*.c 
$ echo --include=*.{cpp} 
--include=*.{cpp} 

Pour obtenir ce dernier pour fonctionner correctement, retirez les accolades:

$ echo --include=*.cpp 
--include=*.cpp