I am relatively new to Unix, and I stumbled across one curiosity. Some shell constructs like case
or find
, employ pattern matching, but it is not quite regex. Other commands, like ed
, sed
, vi
, and awk
use regular expressions for pattern matching. Could somebody list which shell commands (builtins, programs) use regex, and which use the other type of pattern matching?
-
I believe you can use regexes for find and case as well.. – ryekayo Sep 23 '14 at 15:18
2 Answers
case
uses globs, which is a very simple pattern matching system similar to regular expressions. Some tools, like find
, actually support both (via -name
and -regex
in this case). But the case is even more complicated: There are different flavours of regular expressions. Some tools support one, some several. You just have to check per tool and version combination what the man
page or other reference documentation says (and even then it can be difficult to figure out). A reference list would be gigantic, and I don't think that would be a very useful answer.

- 51,350
I think the main difference between using regular expression is whether they require to match the whole string or not. In case
, find
and some other bash commands you have to match the whole string, while in sed
, awk
, grep
and so on you have to match any part of the string. Other than that they are similar, but, of course, not identical.
For example, when you use regular expression in case
statements of bash shell, it is assumed that your regular expression describes the whole string. I.e. (i'm using example here)
case $SERVER in
db-[0-9]+\.host\.com) echo "DB server"
;;
*)echo "Unknown server"
;;
esac
You can see that db-[0-9]+.host.com describes the string, which starts with "db-", then has one or more digits, and then ends with ".host.com", so db-1.host.com will match, while xdb-1.host.com will not.
Now if you look at sed
, and write the search pattern in a similar way
echo "xdb-1.host.com"| sed -nr '/db-[0-9]+\.host\.com/p'
sed
, unlike case
command, WILL print the line xdb-1.host.com, because it can find the search pattern INSIDE this string. So, the idea is not to match the whole string, but to find any occurence of the pattern.
In a similar way, if you use regexp in find
command, the whole string has to match. For example,
find / -regextype sed -regex ".*\.dat"
will find you all the files, which have the extension dat. But if you try to do the same search with sed
,
find / | sed -nr '/.*\.dat/'
it will match all the files, which contain the string ".dat" in their file name.
There are also some minor syntax differences of course. For example if you do
find / -name "*.dat"
this is also a kind of regular expression, where * means "any number of arbitrary symbols", but in the strict sense regexp you should write ".*", where "." means any symbol, and * means any number of symbols of kind ".", so together meaning any number of any symbols.

- 2,779
-
thanks so much. we'll be greatful if you can add me points, because my 1 point is not enough for evaluating other people answers. sigh..) – John Smith Sep 23 '14 at 16:07
-
See Meta-Post on Reputation. You'll find that most people do it two points at a time... – eyoung100 Sep 23 '14 at 16:16