虽然有很多人知道如何使用正则表达式,但一旦要将其运用到各个Linux
命令中,相信仍有很多人会有这样的疑问——“这样的写法到底适不适合这条命令?”
只要知道这3种正则表达式元字符集就足够了
不同的命令,对应的正则表达式元字符的集合范围也不一样。但是理论上来说只要知道以下3
种(2
大类+1
个子集)正则表达式元字符集就足够了。
BRE
(基本正则表达式)元字符集ERE
(扩展正则表达式)元字符集ERE
的AWK
子集
当然,除了它们之外还有GNU
扩展正则表达式元字符集、Perl
扩展正则表达式元字符集、JavaScript
扩展正则表达式元字符集等等。但如果想在任何UNIX
(或者说POSIX
)环境下通用,只记住它们三个就绰绰有余了。(就算你不想局限于POSIX
,其他的大体上都是在ERE
元字符集的基础上加上各自的不同拓展而已,只要ERE
掌握得牢固,学习起来也花不了多少精力。)
各Linux命令分别对应哪个元字符集合?
既然知道了对于Linux
命令,只有3
种分类,那么到底具体是怎样的对应关系呢?只要看下面的表格就一目了然了。
命令 | 对应的元字符集合 |
---|---|
AWK | ERE的AWK子集 |
ed | BRE元字符集 |
egrep | ERE元字符集 |
ex | BRE元字符集 |
grep(没有’-E’) | BRE元字符集 |
grep(有’-E’) | ERE元字符集 |
more | BRE元字符集 |
sed | BRE元字符集 |
vi | BRE元字符集 |
通常的grep
命令(没有-E
选项),在部分原来只属于ERE
元字符集的字符的前面加上反斜杠\
同样能使按照ERE
的规则发挥作用。
各元字符集的说明
既然已经知道了具体那条命名对应哪个集合,下面开始详细介绍各个元字符集。
1.BRE(基本正则表达式)元字符集
元字符集中(并不局限于BRE
),元字符可以根据使用的场合进一步细分为3
组。
a-1.用于匹配字符串的元字符(位于[]外部)
元字符 | 含义 |
---|---|
^ | 匹配字符串(通常是一行)的头部 |
$ | 匹配字符串(通常是一行)的尾部 |
. | 匹配任意一个字符 |
[…] | 匹配被包围在[]中的任意一个字符 |
[^…] | 匹配不被包围在[]中的任意一个字符 |
* | 【重复次数指定】前面出现的内容出现了0次以上 |
{n} | 【重复次数指定】前面出现的内容出现了n次 |
{n,} | 【重复次数指定】前面出现的内容出现了n次 |
{m,n} | 【重复次数指定】前面的内容出现了m次以上,n次以下 |
(…) | 【内容指定】其包围的内容可以被后面引用 |
\n | 【规则复用】指在第n次被(…)包围的匹配规则,用于复用。比如用^([A-Z])123\1 去 匹 配 A B C 123 A B C A B C 。 最 后 去匹配ABC123ABCABC。最后 去匹配ABC123ABCABC。最后之前的\1被解释为[A-Z] |
\x | 转义,如^,\\ , 用 于 匹 配 , ,\\用于匹配^, ,用于匹配,,\本身 |
a-2.用于匹配字符串的元字符(位于[]内部)
元字符 | 含义 |
---|---|
^ | 如果紧跟在[之后,那么代表取反,否则代表[本身 |
- | 用于简单明了地指定匹配字符的范围,而不是逐个列举,如果紧跟在]之前,则代表-本身 |
[:word:] | 被称作POSIX字符类。word可以为alnum(所有的字母和数字)、cntrl(所有控制字符)、lower(所有小写字母)、space(空格、Tab、换行)、alpha(所有字母)、digit(所有数字)、print(除了控制字符之外的所有字符)、upper(所有大写字母)、blank(空格、Tab)、graph(控制字符、空格、Tab以外的所有字符等等 |
[.word.] | 比如说,[[.hoge.]]就相当于(hoge){1,},但是并不常用 |
[=x=] | 比如说,[=a=],可以匹配a、à、â等等,然而这个用法也很不常见 |
b.用于指定被替换后的字符串(位于sed等的s/A/B/中的B部分)
正则表达式不但用于查找字符串,而且常用于加工(替换)。
元字符 | 含义 |
---|---|
\n | 替换第n次被(…)包围的的内容 |
& | 替换成功匹配的全体字符串 |
\x | 转义 |
2.ERE(扩展正则表达式)元字符集
a-1.用于匹配字符串的元字符(位于[]外部)
扩展了BRE
,可使用的元字符增加了(如:+
、?
、|
),然而并不一定兼容BRE
的用法,主要目的是使得书写更加清晰,如:(
、)
、{
、}
等等不需要书写烦人的\
。
元字符 | 含义 |
---|---|
+ | 【重复次数指定】前面出现的内容出现了1次以上 |
{n} | 【重复次数指定】前面出现的内容出现了n次 |
{n,} | 【重复次数指定】前面出现的内容出现了n次 |
{m,n} | 【重复次数指定】前面的内容出现了m次以上,n次以下 |
(…) | 【内容指定】其包围的内容可以被后面引用 |
| | 【逻辑或】只要匹配其左或者右的内容均可,注意以下的写法^ABD |
\x | 转义 |
a-2.用于匹配字符串的元字符(位于[]内部)
这部分跟BRE
相同。
b.用于指定被替换后的字符串(位于sed等的s/A/B/中的B部分)
这部分也是跟BRE
一样。但是,
3.ERE中的AWK子集
该子集中缺少的最重要的一个元字符就是用于指定重复次数的{
和}
。
实际上,2008
版本的POSIX
就有将这个元字符加入回去的建议,但现在各操作系统实装的AWK
程序很少能做到与ERE
通用。