在bash里为我们提供许多通配符,巧用通配符可以简化我们命令,下面开始介绍几种常见的通配符:


      *任意长度的字符;、

例如 如图所示,当前目录下有 a,A,a1,a2,b,B,c,C。使用ls a*表示 显示以a开头的任意文件

结果则输出 a a1 a2

215728931.jpg


?:任意单个字符;

例如 ls a? 则表示以a开头为两个字符的文件  结果为显示a1 a2

220241395.jpg

[]:指定范围内的任意单个字符

例如[abc]  匹配abc三个字符;

220801973.jpg

[^]:也可以表示[!]脱字符,取反,指定范围外的单个字符;

例如[^abc]表示除了abc以外的所有字符。

如图ls [^ab]与ls [!ab]得到的结果都一样,表示除了a b字母以外的文件    

221821910.jpg

{}表示一个范围,必须是两个以上的组合

     例如{ab}表示ab

       正确的用法是 echo a{a,b},得到的输出是aa  ab

       错误的用法是 echo a{a}     我的本意是输出aa , 但输出的结果却是a{a}


214839627.jpg


另外常见的通配符用法有:

[^0-9]表示0-9以外的字符

[a-zA-Z]表示所有的大小写字母
[0-9]所有的数字

[0-9a-zA-Z]所有数字字母

[:digit:]:相当于0-9

所以[0-9]可以这么写[[digit]]

[:lower:]所有小写字母
相当于a-z
[:upper:]所有大写字母
相当于A-Z
[:alpha:]所有大小写字母
相当于a-Za-z
[:alnum:]相当于0-9a-zA-Z

[:space:]空白字符

[:punct:]所有标点符号



问题:

如图所示 当前目录下有 a A a1 b B b1 c C几个文件

225416213.jpg


当我们执行ls [a-d]本意是显示a到d范围内的小写字母名称的文件,按设想输出的结果应该是

a b c (因为没有d) 但结果却是 a A b B c C 难道ls不区分大小写?

而当我们执行 ls [a-c]的时候奇怪的是显示的结果是 a A b B c (那大写的C去哪了呢?)我百思不得其解!



后来在网上找到了答案。


原因是[a-d]是正则式而不是通配符。表达式的顺序与本地环境有关,很多时候是按照字典顺序来排序的


例如 [A-Z] 可能等同于 AbBcCdD...xXyYzZ 也可能是 AaBbCcDd...XxYyZ 还有可能就是C语言环境里面的 ABCD...XYZ


我们可以通过


LC_COLLATE=C  或者 LC_ALL=C


来设置当前为C环境。

215428925.jpg

结果如上,顺利得到我们所要的结果。


或者使用管道命令


例如 ls | grep -E 正则匹配



部分资料出自互联网:


http://dusong1992.blog.163.com/blog/static/120930552201251931148318/


http://stackoverflow.com/questions/4834353/what-is-up-with-a-z-meaning-a-za-z


http://www.linuxsir.org/bbs/thread330042.html



http://zhidao.baidu.com/link?url=dxo5I40tHhIR7JtpyRcTVha--sPZdhQRoGVO0pLQ4XTRuuGWYbQLPcTpkGwQRVsG7PMg77EmacpY1GW_iZ0mF_