Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

regextype with find command

Tags:

regex

linux

find

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
like image 952
Alper Kultur Avatar asked Oct 11 '12 18:10

Alper Kultur


2 Answers

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.

like image 170
Gene Pavlovsky Avatar answered Sep 21 '22 11:09

Gene Pavlovsky


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.

like image 36
alk Avatar answered Sep 20 '22 11:09

alk