在Linux中,有两种流行的正则表达式(Regular Expressions)引擎:

  • POSIX基本正则表达式(BRE)引擎
  • POSIX扩展正则表达式(ERE)引擎

大多数Linux工具都支持BRE,但是只有一些工具支持ERE。

1. BRE模式

RE字符 含义及范例
^word 含义:待查找的字符串(word)在行首
范例:查找行首为#开始的那一行,并列出行号
grep -n '^#'    re.txt
word$ 含义:待查找的字符串(word)在行尾
范例:查找行尾为!开始的那一行,并列出行号
grep -n '!$'  re.txt
. 含义:匹配任意单个字符,除了换行符。点符必须匹配一个字符。
含义:转义字符,将特殊符号的特殊含义去到
* 含义:重复零个到无穷多个的前一个字符
[list] 含义:从字符集合的RE字符里面找出想要的字符
范例:查找含有(gl)或(gd)的那一行,需要特别留意的是,在[]当中代表一个待查找的字符,例如“a[afl]y”代表查找的字符串可以是aay,afy,aly,即[afl]代表a或f或l的意思
[n1-n2] 含义:从字符集合的RE字符里面找出想要选取的字符范围
范例:查找含有任意数字的一行。需要特别留意,在字符集合[]中的减号-是有特殊含义的,它代表两个字符之间的所有连续字符。但这个连续与否与ASCII编码有关,因此,你的编码要设置正确。例如,所以大写字符为[A-Z]。
[^list] 含义:从字符集合的RE字符里面找出不要的字符串或范围
{n,m} 含义:连续n到m个前一个RE字符。若为{n}则是连续n个的前一个RE字符,若为{n,}则是连续n个以上的前一个RE字符
范例:在g与g之间有2个到3个的o存在的字符串,即(goog)(gooog):
grep -n 'go{2, 3}g'  re.txt

注意:正则表达式的特殊字符与一般在命令行输入命令的通配符并不相同。例如,在通配符中,*代表零到无限多个字符的意思,但是在正则表达式中,*则是重复0到无穷多个的前一个RE字符的意思。

BRE特殊字符组

特殊符号 含义
[:alnum:] 代表英文大小写字符及数字,即0-9,A-Z,a-z
[:alpha:] 任何英文大小写字符,即A-Z,a-z
[:blank:] 代表空格键与[Tab]键
[:cntrl:] 代表键盘上面的控制按键,即包括CR,LF,Tab,Del等
[:digit:] 代表数字,即0-9
[:graph:] 除了空格符(空格键与[Tab]键)外的其他所有按键
[:lower:] 代表小写字符,即a-z
[:print:] 代表任何可以被打印出来的字符
[:punct:] 代表标点符号,即" ' ? ! ; : # $
[:upper:] 代表大写字符,即A-Z
[:space:] 任何产生空格的字符,包括空格键[Tab]CR等
[:xdigit:] 代表十六进制的数字类型,因此包括0-9,A-F,a-f的数字与字符

2. ERE模式

RE字符 含义及范例
? 重复前面的字符0次到1次
+ 重复前面的字符1次或多次
{m}、{m, n}(区间) RE字符准确出现m次;RE字符至少出现m次,至多出现n次。gawk中要使用区间,必须指定--re-interval
exp1|exp2 逻辑OR(正则表达式和管道符号之间不能有空格,否则它们也会加到正则表达式模式中)