在linux中,对资源进行选择的时候,通常都会使用到通配符(globbing)、基本正则表达式(Basic Regular Expression)或者扩展正则表达式(Extend Regular Expression),大家肯定都疑惑过,它们在使用时,为什么相同的元字符会表示不同的含义呢?答案其实很简单,在bash环境下是不支持正则表达式的,也就是说那些* + .等之类的都是通配符,而真正支持正则表达式的是grep、sed和awk这些工具。所以在我理解看来,它们貌似一样,都是用来匹配字符的。但在文本处理中,都是用正则表达式,比如像awk,sed,是针对文件的内容的;而通配符多用在bash环境下的find,ls,cp等命令中,是用来查找文件名的。
以下是自己总结的三者元字符的区别,空格表示此处无意义
分类 | 符号 | globbing | BRE | ERE |
字符匹配 | . | 单个字符 | 单个字符 | |
字符匹配 | ? | 单个字符 | ||
字符匹配 | * | 匹配任意长度字符 | 其前面的字符任意次 | 其前面的字符任意次 |
字符匹配 | .* | 任意长度字符 | 任意长度字符 | |
字符匹配 | [] | 指定范围内任意字符 | 指定范围内任意字符 | 指定范围内任意字符 |
字符匹配 | [^] | 指定范围外任意字符 | 指定范围外任意字符 | 指定范围外任意字符 |
字符匹配 | [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次,格式{m} | ||
次数匹配 | 至多n次,格式\{0,n\} | 至多n次,格式{0,n} | ||
次数匹配 | m次到n次,格式\{m,n\} | m次到n次,格式{m,n} | ||
分组引用 | \1,\2分组,格式\(\) | \1,\2分组,格式() |
本文出自 “dmwing” 博客,转载请与作者联系!
原文地址:http://dmwing.blog.51cto.com/11607397/1831777