1.正则表达式常用规则
1.1 ?表示出现0或者1次
1.2 * 表示大于等于0次
1.3 + 表示大于等于1次
1.4 {m,n} 表示大于等于m次,小于等于n次
1.5 | 表示“或者”
2.正则表达式常用例子
2.1例子
$ less phonenumber.txt
317-555-1234
000-555-1234
312 555-1234
$ less isphone.sh
#!/bin/bash
# script to filter out bad phone numbers
less phonenumber.txt | gawk --re-interval '/^\(?[2-9][0-9]{2}\)?(| |-|\.)[0-9]{3}( |-|\.)[0-9]{4}/{print $0}'
注释:
在构建正则表达式时,最好从左侧开始,然后逐步写出可能遇到的各种字符模式。在这个例子中,电话号码中可能有也可能没有左括号,这可以用下列模式来匹配:
^\(?
紧接着是3位区号。在美国,区号以数字2开始(没有以数字0或1开始的区号),最大可为9。要匹配区号,可以使用下列模式:
[2-9][0-9]{
2}
这要求第一个字符是2~9的数字,后跟任意两位数字。在区号后面,收尾的右括号可以有,也可以没有:
\)?
在区号之后,存在如下可能:有一个空格,没有空格,有一个连字符,有一个点号。你可以使用竖线符号,并用圆括号进行分组:
(| |-|\.)
第一个竖线符号紧跟在左括号后,用来匹配没有空格的情形。必须将点号字符转义,否则它会被解释成可匹配任意字符。紧接着是3位电话交换机号码。这里没什么需要特别注意的:
[0-9]{
3}
在电话交换机号码之后,必须匹配一个空格、一个连字符或一个点号(这次不用考虑匹配没有空格的情况,因为在电话交换机号码和其余号码间必须有至少一个空格):
( |-|\.)
最后,必须在字符串尾部匹配4位本地电话分机号:
[0-9]{
4}$
完整的正则表达式如下:
^\(?[2-9][0-9]{
2}\)?(| |-|\.)[0-9]{
3}( |-|\.)[0-9]{
4}$
2.2例子
$ less emailnumber.txt
[email protected]
[email protected]
rich@here-now
[email protected]
[email protected]
rich/[email protected]
rich#[email protected]
rich*[email protected]
$ less isemail.sh
#!/bin/bash
less emailnumber.txt | gawk --re-interval '/^([a-zA-Z0-9_\-\.\+]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$/{print $0}'
运行结果
$ bash isemail.sh
[email protected]
[email protected]
[email protected]
注释:
下面从左侧开始构建这个正则表达式。我们知道,用户名中可以有多个有效字符,这相当容易:
^([a-zA-Z0-9_\-\.\+]+)@
这个分组指定了用户名中允许出现的字符,加号表明必须有至少一个字符。接下来的字符显然是@,这没什么意外的。hostname模式使用同样的方法来匹配服务器名和子域名:
([a-zA-Z0-9_\-\.]+)
对于顶级域名,有一些特殊的规则。顶级域名只能是字母字符,长度必须不少于2个字符(用于表示国家或地区代码),并且不超过5个字符。下面是匹配顶级域名的正则表达式:
\.([a-zA-Z]{
2,5})$
2.3例子
参考:
- linux命令行与shell脚本编程大全(第四版)