shell编程之正则表达式 详解!内含例题

201 阅读2分钟

1、正则表达式概述

正则表达式分为:基础正则表达式与扩展正则表达式,它不是一个工具程序,而是一个字符串处理的标准依据,是使用单个字符串、匹配一系列符合某个语法规则的字符串。正则表达式由普通字符与元字符组成。

普通字符:包括大小写字母、数字、标点符号及一些其他符号

元字符:正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符在目标对象中的出现模式

1.1、支持工具

支持正则表达式的工具:vim,grep,egrep,sed,awk

2、基础正则表达式

2.1、基础元字符

元字符作用
\转义字符,用于取消特殊符号的含义,如:!,\n 等
匹配字符串的开始位置(以...开头)如:^world 匹配以world开头的行
$匹配字符串的结束位置(以...结尾)如:world$ 匹配以world结尾的行
.匹配除\n(换行)之外的任意一个字符
*匹配前面的子表达式(前一个字符)0次或者多次
[list]匹配 list 列表中的一个字符 如:[0-9] 匹配任意一个数字
[^list]匹配不在 list 列表中的一个字符(反选)如:[^0-9]匹配任意一个非数字
\{n\}匹配前面的子表达式(前一个字符)n次 如:[0-9]\{2\} 匹配两位数
\{n,\}匹配前面的子表达式不少于n次 如:[0-9]\{2,\} 表示两位或两位以上的数字
\{n,m\}匹配前面子表达式n到m次 如:[a-z]\{2,3\} 匹配两到三位的小写字母
\w匹配包括下划线的任何单词字符 如:[A-Za-z0-9_]
\W匹配任意一个非单词字符 如:[^A-Za-z0-9_]
\d匹配一个数字字符 等价于[0-9]
\D匹配一个非数字字符 等价于[^0-9]
\s空白符
\S非空白符
  • tips:egrep 、awk使用{n}、{n,}、{n,m}匹配时 "{}"前不用加"\"

2.2、示例:

[root@localhost ~]# grep "^root" /etc/passwd   ## 匹配以"root" 开头的行
root:x:0:0:root:/root:/bin/bash

[root@localhost ~]# grep "bash$" /etc/passwd   ## 匹配以"bash" 结尾的行
root:x:0:0:root:/root:/bin/bash

[root@localhost ~]# cat test.txt   
gd
god
good                            ## 准备示例测试用的文件
goood
gooood
goooabcd
gooooood
gooooooddddd
abccba
abccba123
oooogooood
oooogd
gold
goad
golad
goold
goolad
go8d
goAd
go;d

[root@localhost ~]# grep "goo*d" test.txt    ## 匹配*号前面"o" 0次或者多次
god
good
goood
gooood
gooooood
gooooooddddd
oooogooood

[root@localhost ~]# grep "goo.d" test.txt     ## 除\n(换行)之外的任意一个字符
goood

[root@localhost ~]# grep "go\{2\}d" test.txt  ##匹配"o" 两次
good

[root@localhost ~]# grep "go[ola]\{2\}d" test.txt
goood 
golad              ## 匹配 [ola] 列表里面任意一个字符两次
goold

[root@localhost ~]# grep "go\{2,\}d" test.txt 
good
goood                  ## 匹配"0" 不少于2次(次数>=2)
gooood
gooooood
gooooooddddd
oooogooood

[root@localhost ~]# grep "go\{2,3\}d" test.txt 
good
goood                  ## 匹配"o" 两次或者3次

3、扩展正则表达式

扩展正则表达式是对基础正则表达式的扩充和深化

3.1、支持工具

扩展正则表达式支持工具:egrep、awk grep -E、sed -r

3.2、扩展元字符

元字符作用
+匹配前面的子表达式1次以上,如:go+d ,将匹配至少一个"o"
?匹配前面的子表达式0次或者1次,如:go?d,将匹配 gd 或者 god
()将()号中的字符串作为一个整体,如:(xyz)+,将匹配xyz整体1次以上
|以或的方式匹配字符串,如:good | great,将匹配 good 或者 great

3.3、示例:

[root@localhost ~]# cat test.txt   
gd
god
good                            ## 准备示例测试用的文件
goood
gooood
goooabcd
gooooood
gooooooddddd
abccba
abccba123
oooogooood
oooogd
gold
goad
golad
goold
goolad
go8d
goAd
go;d

[root@localhost ~]# egrep "go+d" test.txt 
god
good                ## 匹配"o" 1次及以上多次
goood
gooood
gooooood
gooooooddddd
oooogooood

[root@localhost ~]# egrep "go?d" test.txt 
gd
god                ## 匹配 "o" 0次或者1次
oooogd

[root@localhost ~]# egrep "g(oo)+d" test.txt 
good
gooood              ## 匹配 以"oo"为整体的字符串1次及其以上多次
gooooood
gooooooddddd
oooogooood

[root@localhost ~]# egrep "g(oo|oa)d" test.txt 
good
goad                ## 匹配以 "oo" 或者 "oa" 为整体的

4、正则例题 1:筛选正确的座机号码

  • 以025 区号为例:
区号: ^025               ## 以区号 025 开头

连接符:[- ]?             ## 区号与后8位号码 中间连接符"-" 或者" "0次或者1次

号码 :[58][0-9]{7}$      ## 以5或者8开头后面7位号码随机数字

整体表达式:egrep "^025[- ]?[58][0-9]{7}$"

41.jpg

5、正则例题 2:筛选正确的邮箱格式

要求:

  • 用户名@:长度要求在6-18位,任意大小写英文,任意数字,除了"@"符号和空格以外的其他任意符号字符,开头只能是 _ 或者字母

  • 子域名.[二级域名]:长度任意,符号只能包含 "-" "_" "."

  • .顶级域名:长度在2-5,任意大小写英文

用户名@:^[_A-Za-z][^@ ]{5,17}@

子域名.[二级域名][A-Za-z0-9_\-\.]+

顶级域名:\.([A-Za-z]{2,5})$

整体表达式:egrep "^[_A-Za-z][^@ ]{5,17}@[A-Za-z0-9_\-\.]+\.([A-Za-z]{2,5})$"

42.jpg