ERE模式
ERE模式比BRE能支持更多的操作,当前sed不支持ERE,gawk支持ERE
。
1 问号
之前介绍了点号匹配1次
,星号匹配0次或多次
,而问号是匹配0次或1次
。
比如文件data4的内容为:
abc
abbc
ac
a
输入:
gawk '/ab?c/{print $0}' data4
运行结果为:
abc
ac
可以看出abbc没有匹配上,同样,这里也可以使用BRE中的一些规则,比如使用方括号指定范围,输入:
gawk '/a[a-c]?c/{print $0}' data4
运行结果为:
abc
ac
2 加号
问号匹配0次或1次,而加号匹配1次或多次。比如文本data4的内容为:
abc
abbc
ac
a
输入:
gawk '/ab+c/{print $0}' data4
运行后结果为:
abc
abbc
3 花括号
花括号用于限定字符出现的个数,有两种用法:
{m}表示前面的字符出现m次;
{m,n}表示前面的字符出现次数大于m次小于等于n次
{m,} 紧跟在它前面的单元应匹配至少m次
{,n} 紧跟在它前面的单元应匹配最多n次
比如文件data6的内容为:
ac
abc
abbc
abbbc
输入:
gawk '/ab{1,2}c/{print $0}' data6
运行后结果为
abc
abbc
4 OR操作
使用单竖线(管道符号),可以实现或的操作,也就是竖线左右两侧只要有一个匹配成功则输出,比如输入:
echo "zhao ben shan"|gawk '/b[a-z]+n|dan/{print $0}'
运行结果为:
zhao ben shan
注意上面的左右两侧的模式也是可以使用正则表达式。
5 小括号变零为整
正则表达式中可以使用小括号包起来一些字符或者其他正则表达式,小括号的内容可以看成一个整体。比如文本data7的内容为:
January
Jan
输入
gawk '/Jan(uary)?/{print $0}' data7
运行结果为:
January
Jan
这里表示uary这个整体可能出现0次或者1次。
还有一种非常常用的用法,把小括号和管道符号联合使用,用于匹配模式的组合,比如有文件data8内容为:
abc
dbc
abf
dbf
def
输入:
gawk '/(a|d)b(c|f)/{print $0}' data8
运行后结果为:
abc
dbc
abf
dbf
小括号里面的字符随意选择一个即可匹配成功。