《Linux命令行与shell脚本编程大全》第二十章 正则表达式 (2)

正则表达式模式也可以用圆括号进行分组。当你将正则表达式模式分组时,该组会被视为一个标准字符。可以像对普通字符一样给该组使用特殊字符。

例子:

$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 小结

正则表达式定义了用来过滤数据流中文本的模式模板。

模式由标准文本字符和特殊字符的组成。

正则表达式引擎用特殊字符来匹配一系列单个或多个字符,这类似于其他应用程序中通配符的工作方式。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygfwx.html