I am trying to grep for a word and any text inside parenthesis. Any tools you can think of would be appreciated. Awk, sed, perl, or anything else you can think of.
The words I trying to match is function1 with anything inside parenthesis. Examples of things i would like to match.
int function1(int var1)
int function1(int var1, int var2)
int function1(int var1, int var2, int var3)
double function1(int var1, int var2, int var3)
float function1(int var1, int var2, int var3)
Examples of things i would like to not match.
int function1()
int function1
function1
int function2(int var1)
int function2(int var1, int var2)
int function2(int var1, int var2, int var3)
double function2(int var1, int var2, int var3)
float function2(int var1, int var2, int var3)
cat cokedude.input
int function1(int var1)
int function1(int var1, int var2)
int function1(int var1, int var2, int var3)
double function1(int var1, int var2, int var3)
float function1(int var1, int var2, int var3)
Examples of things i would like to not match.
int function1()
int function1
function1
int function2(int var1)
int function2(int var1, int var2)
int function2(int var1, int var2, int var3)
double function2(int var1, int var2, int var3)
float function2(int var1, int var2, int var3)
grep -E '^(int|float|double) function1\(.+\)' cokedude.input
int function1(int var1)
int function1(int var1, int var2)
int function1(int var1, int var2, int var3)
double function1(int var1, int var2, int var3)
float function1(int var1, int var2, int var3)
$ nawk '/^(int|float|double) function1\([^)]+\)/' cokedude.input
int function1(int var1)
int function1(int var1, int var2)
int function1(int var1, int var2, int var3)
double function1(int var1, int var2, int var3)
float function1(int var1, int var2, int var3)
or /usr/xpg4/bin/awk instead of nawk (on Solaris).
Yes you must quote the *, but you must also quote the embedded space and the ( and ) grep -i int\ function1\(\*\) /export/home/
But another quoting type looks better: grep -i "int function1(*)" /export/home/
This quoting protects against expansion in the shell. But the shell dequotes it, then invokes the grep.
Your next mistake is that in grep (regular expression) a * means zero or more occurrences of the preceding character. Certainly you mean .* , "any character any times". In regular expression the dot means "any character".
Last a comment regarding the grep options. If your argument is a directory then grep -r (recursive) makes sense, but might require GNU grep i.e. /usr/gnu/bin/grep in Solaris 11. grep -i is case-insensitive.
perl -ne 'print if /^(int|float|double) function1\(.+\)/' < cokedude.input
int function1(int var1)
int function1(int var1, int var2)
int function1(int var1, int var2, int var3)
double function1(int var1, int var2, int var3)
float function1(int var1, int var2, int var3)
But this would match int function1() function2()
because the .*. would reach from the first ( to the last ). So instead of "any character" you should have "a character that is not a )".
In regular expression this is [^)]
grep knows the \{m,n\} quantifier that we can use here: the preceding character must occur between m and n times.
Instead of the many int,float,double,... it's maybe sufficient to require a character between a and z: [a-z]
I also put a * in the [] character set, in order to allow int * function1(x)
This * is not a quantifier because it is in the character set. \{1,\} means the preceding character (here: from a character set) may exist 1 or more times, no upper limit.