除了 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_COLLATE或LC_ALL为 "C"。
字符类可以在方括号内指定,使用语法 [: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 信息页面中阅读更多内容,章节
-> -> -> 。