正则表达式模式也可以用圆括号进行分组。当你将正则表达式模式分组时,该组会被视为一个标准字符。可以像对普通字符一样给该组使用特殊字符。
例子:
$echo “Sat” | gawk ‘/Sat(urday)?/ {print $0}’
相当于把urday当做一个整体了, /SatF?/ 跟这个类似,F出现0次或1次。
()需要转义的用法:
echo "Sat(urday)" | gawk '/Sat\(urday\)/ {print $0}'
echo "Saturday" | gawk '/Sat\(urday\)/ {print $0}'
还可以将分组和管道符号一起使用来创建可能的模式匹配组:
echo "cat" | gawk '/(b|c)a(b|t)/ {print $0}'
这样相当于匹配 bab bat cab cat 四种。
20.4 正则表达式实战 20.4.1 目录文件计数
这个例子用于对PATH环境变量中各个目录里的可执行文件进行计数:
#!/bin/bash
mypath=$(echo $PATH | sed 's/:/ /g') # 这里把用冒号分割的字符串换成用空格分割
#echo "mypath = $mypath"
count=0
for dir in $mypath
do
check=$(ls $dir) // 查询单个目录
for item in $check
do
count=$[ count + 1 ]
done
echo "$dir - $count"
count=0
done
20.4.2 验证电话号码
美国的号码格式如下:
(223)456-7890
(223) 456-7890
223-456-7890
223.456.7890
最开始是( : ^\(?
三位区号(第一位必须大于2):[2-9][0-9]{2}
然后又是括号:\)?
然后是分隔符(空格,点,减号):( |-|\.)
然后是3位数字:[0-9]{3}
又是分隔符:( |-|\.)
最后四位数字:[0-9]{4}
连起来就是:
^\(?[2-9][0-9]{2}\)?( |-|\.)[0-9]{3}( |-|\.)[0-9]{4}$
例子:
xcy@xcy-virtual-machine:~/shell/20zhang$ cat isphone
#!/bin/bash
gawk --re-interval '/^\(?[2-9][0-9]{2}\)?( |-|\.)[0-9]{3}( |-|\.)[0-9]{4}$/ {print $0}'
xcy@xcy-virtual-machine:~/shell/20zhang$ echo "222-098-2231" | ./isphone
222-098-2231
xcy@xcy-virtual-machine:~/shell/20zhang$ echo "122-098-2231" | ./isphone
xcy@xcy-virtual-machine:~/shell/20zhang$ echo "222.098.2231" | ./isphone
222.098.2231
xcy@xcy-virtual-machine:~/shell/20zhang$
还可以将整个文件重定向到脚本:
phonelist里面存放着一行一行的数据:
$cat phonelist | ./isphone
这个例子其实也不是特别合理,比如下面几种情况也算是合法号码:
(235.561-4430
343) 451.4651
总之还是有待优化。
20.4.3 解析邮件地址
邮件地址的形式如下:
username@hostname
username值可用字母数字字符以及以下特殊字符:
1)点号
2)单破折线
3)加号
4)下划线
hostname部分由一个或多个域名和一个服务器名组成。只允许字母数字字符以及下面的特殊字符:比如(xiaochongyong@amwell-haha.com)
1)点号
2)下划线
username@相当于:^([a-zA-Z0-9_\-\.\+]+)@
注意: [] 里面是字符组,相当于之前的[xcs]。() 里面是表达式分组
hostname相当于:([a-zA-Z0-9_\-\.\]+)
后面还要接顶级域名。.com .cn .org 等
只能是字母字符,必须不少于两个字符,长度不超多5个字符:\.([a-zA-Z]{2,5})$
连起来就是:
^([a-zA-Z0-9_\.\-\+]+)@([a-zA-Z0-9_\.\-]+)\.([a-zA-Z]{2,5})$
例子:
xcy@xcy-virtual-machine:~/shell/20zhang$ cat isemail
#!/bin/bash
gawk --re-interval '/^([a-zA-Z0-9_\.\-\+]+)\@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$/ {print $0}'
xcy@xcy-virtual-machine:~/shell/20zhang$ echo "222x2iaochongyong@s1amwell-elec.com" | ./isemail
222x2iaochongyong@s1amwell-elec.com
xcy@xcy-virtual-machine:~/shell/20zhang$ echo "222x2iaocho%ngyong@s1amwell-elec.com" | ./isemail
xcy@xcy-virtual-machine:~/shell/20zhang$ echo "222x2iaocho%ngyong+@s1amwell-elec.com" | ./isemail
xcy@xcy-virtual-machine:~/shell/20zhang$ echo "222x2iaochongyong+@s1amwell-elec.com" | ./isemail
222x2iaochongyong+@s1amwell-elec.com
xcy@xcy-virtual-machine:~/shell/20zhang$ echo "222x2iaochongyong+@s1amwell-elec..com" | ./isemail
222x2iaochongyong+@s1amwell-elec..com
xcy@xcy-virtual-machine:~/shell/20zhang$ echo "222x2iaochongyong+@s1amwell-elec._.com" | ./isemail
222x2iaochongyong+@s1amwell-elec._.com
xcy@xcy-virtual-machine:~/shell/20zhang$
20.5 小结
正则表达式定义了用来过滤数据流中文本的模式模板。
模式由标准文本字符和特殊字符的组成。
正则表达式引擎用特殊字符来匹配一系列单个或多个字符,这类似于其他应用程序中通配符的工作方式。