Reputation: 135
I am trying to use the find command with -regextype
but it could not able to work properly.
I am trying to find all c
and h
files send them to pipe and grep the name, func_foo
inside those files. What am I missing?
$ find ./ -regextype sed -regex ".*\[c|h]" | xargs grep -n --color func_foo
Also in a similar aspect I tried the following command but it gives me an error like paths must precede expression:
$ find ./ -type f "*.c" | xargs grep -n --color func_foo
Upvotes: 9
Views: 17844
Reputation: 1645
The accepted answer contains some inaccuracies.
On my system, GNU find's manpage says to run find -regextype help
to see the list of supported regex types.
# find -regextype help
find: Unknown regular expression type 'help'; valid types are 'findutils-default', 'awk', 'egrep', 'ed', 'emacs', 'gnu-awk', 'grep', 'posix-awk', 'posix-basic', 'posix-egrep', 'posix-extended', 'posix-minimal-basic', 'sed'.
E.g. find . -regextype egrep -regex '.*\.(c|h)'
finds .c
and .h
files.
Your regexp syntax was wrong, you had square brackets instead of parentheses. With square brackets, it would be [ch]
.
You can just use the default regexp type as well: find . -regex '.*\.\(c\|h\)$'
also works. Notice that you have to escape (
, |
, )
characters in this case (with sed
regextype as well). You don't have to escape them when using egrep
, posix-egrep
, posix-extended
.
Upvotes: 18
Reputation: 70921
Why not just do:
find ./ -name "*.[c|h]" | xargs grep -n --color func_foo
and
find ./ -type f -name "*.c" | xargs grep -n --color func_foo
Regarding the valid paramters to find
's option -regextype
this comes verbatim from man find
:
-regextype type
Changes the regular expression syntax understood by -regex and -iregex tests which occur later on the command line. Currently-implemented types are emacs (this is the default), posix-awk, posix-basic, posix-egrep and posix-extended
There is no type sed
.
Upvotes: 3