Using regex in Mac OS X: why I have to add \ in {3, 5} ==> \{3, 5\} ...?

If your shell is ksh then you could list files in the current directory without an extension like this:

printf '%s\n' !(*.*)

Bash supports ksh extended globs when you enable them:

shopt -s extglob
printf '%s\n' !(*.*)

If I understand your question correctly, you do not need to escape the curly-braces with a backslash if you form the command properly.

In other words, when using a RegRx with grep, let it know the search pattern is a RegEx by using the -E option.

If you want an inverse match then use the -v option as well.

Example:

ls | grep -E -v '\.[A-Za-z]{0,5}$'
  • Note I used {0,5}$ instead of {3,5}$ to account for any extension up to 5 characters. If you want to include files that might have a 1 or 2 character extensions, then use {3,5}$ instead.

You can also use the following example:

ls | grep -E -v '\.[[:alpha:]]{0,5}$'

Sometimes a file extension can have numbers in them, so to account for that, use as an example:

ls | grep -E -v '\.[A-Za-z0-9]{0,5}$'

Or:

ls | grep -E -v '\.[[:alnum:]]{0,5}$'

Note: Some commands require the options to be passed individually, while others can be combined. In this case, grep does allow options to be concatenated. So in the example commands, -E -v can be expressed as -Ev or -vE, if you wish.