4.3. 使用 Bash 功能进行模式匹配

4.3.1. 字符范围

除了 grep 和正则表达式,您还可以在 shell 中直接进行大量的模式匹配,而无需使用外部程序。

如您所知,星号 (*) 和问号 (?) 分别匹配任何字符串或任何单个字符。引用这些特殊字符可以按字面意思匹配它们

cathy ~> touch "*"

cathy ~> ls "*"
*

但是您也可以使用方括号来匹配任何封闭的字符或字符范围,如果字符对之间用连字符分隔。例如

cathy ~> ls -ld [a-cx-z]*
drwxr-xr-x    2 cathy	 cathy		4096 Jul 20  2002 app-defaults/
drwxrwxr-x    4 cathy    cathy          4096 May 25  2002 arabic/
drwxrwxr-x    2 cathy    cathy          4096 Mar  4 18:30 bin/
drwxr-xr-x    7 cathy    cathy          4096 Sep  2  2001 crossover/
drwxrwxr-x    3 cathy    cathy          4096 Mar 22  2002 xml/

这会列出 cathy 主目录中所有以 "a""b""c""x""y""z" 开头的文件。

如果括号内的第一个字符是 "!""^",则将匹配任何未封闭的字符。要匹配破折号 ("-"),请将其作为集合中的第一个或最后一个字符包含在内。排序取决于当前的 locale 和以下变量的值LC_COLLATE变量(如果已设置)。请注意,如果排序按字典顺序进行,则其他 locale 可能会将 "[a-cx-z]" 解释为 "[aBbCcXxYyZz]"。如果您想确保对范围进行传统解释,请通过设置来强制执行此行为LC_COLLATELC_ALL"C"

4.3.2. 字符类

字符类可以在方括号内指定,使用语法 [:CLASS:],其中 CLASS 在 POSIX 标准中定义,并具有以下值之一

"alnum""alpha""ascii""blank""cntrl""digit""graph""lower""print""punct""space""upper""word""xdigit"

一些例子

cathy ~> ls -ld [[:digit:]]*
drwxrwxr-x    2 cathy	cathy		4096 Apr 20 13:45 2/

cathy ~> ls -ld [[:upper:]]*
drwxrwxr--    3 cathy   cathy           4096 Sep 30  2001 Nautilus/
drwxrwxr-x    4 cathy   cathy           4096 Jul 11  2002 OpenOffice.org1.0/
-rw-rw-r--    1 cathy   cathy         997376 Apr 18 15:39 Schedule.sdc

extglobshell 选项启用时(使用 shopt 内置命令),将识别几个扩展的模式匹配运算符。请在 Bash 信息页面中阅读更多内容,章节 Basic shell features->Shell Expansions->Filename Expansion->Pattern Matching