在linux中,对资源进行选择的时候,通常都会使用到通配符(globbing)、基本正则表达式(Basic Regular Expression)或者扩展正则表达式(Extend Regular Expression),大家肯定都疑惑过,它们在使用时,为什么相同的元字符会表示不同的含义呢?答案其实很简单,在bash环境下是不支持正则表达式的,也就是说那些* + .等之类的都是通配符,而真正支持正则表达式的是grep、sed和awk这些工具。所以在我理解看来,它们貌似一样,都是用来匹配字符的。但在文本处理中,都是用正则表达式,比如像awk,sed,是针对文件的内容的;而通配符多用在bash环境下的find,ls,cp等命令中,是用来查找文件名的。
以下是自己总结的三者匹配资源的区别,空格表示此处无意义
分类 | 符号 | ERE | BRE | globbing(字符匹配) |
字符匹配 | . | 单个字符 | 单个字符 | |
字符匹配 | ? | 单个字符 | ||
字符匹配 | * | 其前面的字符任意次 | 其前面的字符任意次 | 任意长度任意字符 |
字符匹配 | .* | 任意长度任意字符 | 任意长度任意字符 | |
字符匹配 | [] | 指定范围内任意一个字符 | 指定范围内任意一个字符 | 指定范围内任意一个字符 |
字符匹配 | [^] | 指定范围外任意一个字符 | 指定范围外任意一个字符 | 指定范围外任意一个字符 |
字符匹配 | [0-9] | 任意一个数字 | 任意一个数字 | 任意一个数字 |
字符匹配 | [a-z] | 任意一个小写字母 | 任意一个小写字母 | 任意一个小写字母 |
字符匹配 | [A-Z] | 任意一个大写字母 | 任意一个大写字母 | 任意一个大写字母 |
字符匹配 | [[:digit:]] | 任意一个数字 | 任意一个数字 | 任意一个数字 |
字符匹配 | [[:lower:]] | 任意一个小写字母 | 任意一个小写字母 | 任意一个小写字母 |
字符匹配 | [[:upper:]] | 任意一个大写字母 | 任意一个大写字母 | 任意一个大写字母 |
字符匹配 | [[:alpha:]] | 任意一个字母 | 任意一个字母 | 任意一个字母 |
字符匹配 | [[:alnum:]] | 任意一个字母或数字 | 任意一个字母或数字 | 任意一个字母或数字 |
字符匹配 | [[:space:]] | 任意一个空格符 | 任意一个空格符 | 任意一个空格符 |
字符匹配 | [[:punct:]] | 任意一个标点符号 | 任意一个标点符号 | 任意一个标点符号 |
位置锚定 | ^ | 锚定行首 | 锚定行首 | |
位置锚定 | $ | 锚定行尾 | 锚定行尾 | |
位置锚定 | \< | 锚定词首 | 锚定词首 | |
位置锚定 | \> | 锚定词尾 | 锚定词尾 | |
次数匹配 | \?;? | 前面的字符0次或1次 | 前面的字符0次或1次 | |
次数匹配 | \+;+ | 前面的字符至少1次 | 前面的字符至少1次 | |
次数匹配 | m次,格式\{m\} | m次,格式{m} | ||
次数匹配 | 至少m次,格式\{m,\} | 至少m次,格式{m} | ||
次数匹配 | 至多n次,格式\{0,n\} | 至多n次,格式{0,n} | ||
次数匹配 | m次到n次,格式\{m,n\} | m次到n次,格式{m,n} | ||
分组引用 | \1,\2分组,格式\(\) | \1,\2分组,格式() |
注意
[root@centos7 tmp]# echo "123abc" | tr -d "[[:digit:]]"
abc
[root@centos7 tmp]# echo "123abc" | tr -d "[^[:digit:]]"
abc
[root@centos7 tmp]# echo "123a^bc" | tr -d "[^[:digit:]]"
abc
你看出什么了吗?
答案就是此处[^[:digit:]]并未被识别为数字以外的字符,你知道原因吗?