shell脚本中正则表达式总结

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例子

参考:
  1. linux命令行与shell脚本编程大全(第四版)

猜你喜欢

转载自blog.csdn.net/weixin_44231554/article/details/130337266