在bash里为我们提供许多通配符,巧用通配符可以简化我们命令,下面开始介绍几种常见的通配符:
*:任意长度的字符;、
例如 如图所示,当前目录下有 a,A,a1,a2,b,B,c,C。使用ls a*表示 显示以a开头的任意文件
结果则输出 a a1 a2
?:任意单个字符;
例如 ls a? 则表示以a开头为两个字符的文件 结果为显示a1 a2
[]:指定范围内的任意单个字符
例如[abc] 匹配a,b,c三个字符;
[^]:也可以表示[!]脱字符,取反,指定范围外的单个字符;
例如[^abc]表示除了a,b,c以外的所有字符。
如图ls [^ab]与ls [!ab]得到的结果都一样,表示除了a b字母以外的文件
{}表示一个范围,必须是两个以上的组合
例如{a,b}表示a,b;
正确的用法是 echo a{a,b},得到的输出是aa ab
错误的用法是 echo a{a} 我的本意是输出aa , 但输出的结果却是a{a}
另外常见的通配符用法有:
[^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几个文件
当我们执行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环境。
结果如上,顺利得到我们所要的结果。
或者使用管道命令
例如 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
转载于:https://blog.51cto.com/lulucao2006/1340024