> 文档中心 > shell编程中十分重要的正则表达式(你若决定灿烂,山无遮,海无拦)

shell编程中十分重要的正则表达式(你若决定灿烂,山无遮,海无拦)

目录

前言 

一、 基础正则表达式常见元字符

示例1:转义字符\

示例2:^开头

 示例3:$结尾

 示例4:点和星

示例5:复合使用

 示例6:列表

 示例7:\{n\}

 示例8:\{n,m\}

 二、扩展正则表达式元字符

示例1:加号

 示例2:问号

 示例3:括号

 示例4:习题

 示例5:习题

 总结


前言 

Linux命令中,可以使用通配符替代或者识别某一些文件名,通常用于模糊查询的场景

正则表达式与通配符类似,但是匹配的准确度比通配符更高

正则表达式组成:

  • 普通字符:大小写字母、数字、标点符号及一些其他符号
  • 元字符:在正在表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符或表达式)在目标对象中的出现模式

一、 基础正则表达式常见元字符

(支持的工具: grep、egrep、sed、 awk)

\

转义字符,用于取消特殊符号的含义,例: \!、\n、\$等

^

匹配字符串开始的位置

$

匹配字符串结束的位置,例: word$、^$匹配空行

.

匹配除\n之外的任意的一个字符,例: go.d、g..d

*

匹配前面子表达式0次或者多次,例: goo*d、 go.*d

[list]

匹配list列表中的一个字符,例: go[ola]d,[abc]、[a-z]、[a-z0-9]、[0-9]匹配任意一位数字

[^list]

匹配任意非list列表中的一个字符,取反,例:[^0-9]、[^A-Z0-9]、[^a-z]匹配任意一位非小写字母

\{n\}

匹配前面的子表达式n次,例: go\{2\}d、'[0-9]\{2\}'匹配两位数字

\{n,\}

匹配前面的子表达式不少于n次

\{n,m\}

匹配前面的子表达式n到m次

注: egrep、 awk使用{n}、{n,}、{n, m}匹配时"}"前不用加"\"

示例1:转义字符\

可以把特殊符号转换成普通符号字符;还可以把普通字符转换成特殊功能

\&

单个&代表后台运行

\|

单个|代表或

\!

单个!代表取反

\!

单个=代表复制或者字符判断

\$

单个$代表引用变量

\n

转换后是换行符

\t

转换后是制表符

\r

转换后是回车符

\w

匹配包括下划线的任何单词字符

\W(大写)

匹配任何非单词字符。等价于"[^A-Za-z0-9_]"

\d

匹配一个数字字符

\D

匹配一个非数字字符。等价于[^0-9]

\s

空白符(空格和制表符)

\S(大写)

非空白符

示例2:^开头

 示例3:$结尾

 示例4:点和星

 

 grep匹配只要包括这个字符串的行就显示出来,将头尾限制后就不会匹配到多余字符的行了

示例5:复合使用

 示例6:列表

 示例7:\{n\}

 示例8:\{n,m\}

 二、扩展正则表达式元字符

(支持的工具: egrep、 awk、 grep-E、 sed -r)

+

匹配前面子表达式1次以上,例: go+d,将匹配至少一个o,如god、good、 goood等

匹配前面子表达式0次或者1次,例: go?d,将匹配gd或god

()

将括号中的字符串作为一个整体,例1: g(0o)+d,将匹配oo整体1次以上,如good、gooood等

|

以或的方式匹配字条串,例: g(oo|la)d,将匹配good或者glad

示例1:加号

 示例2:问号

 示例3:括号

 示例4:习题

模拟匹配南京的电信号码

025 5xxxxx

025 8xxxxx

025-

025xxxxxxx

[root@localhost regular]# cat testfile102588888888  #符合025-5555555555025 12345678025 54321678 #符合025ABC88888025-85432109  #符合0251-854321090025-85432109

 示例5:习题

匹配电子邮箱:

用户名@子域名.[二级域名],顶级域

  • zhangsan123@qq.com (符合)
  • li_si@163.com
  • wang@wu@sina.com
  • zhao liu@126.com
  • qianqi@sina.com.cn(符合)

要求:

  1. 用户名@:长度要求在6-18位,任意大小写英文,任意数字,除了@符号和空格以外的其它任意符号字符,开头只能是_或者字母
  2. 子域名.[二级域名]:长度任意,符号只能包含-_.
  3. .顶级域名:长度在2-5,任意大小写英文
  4. 完整匹配
长度要求在6-18位 {6,18}任意大小写英文,任意数字  [A-Za-z0-9] 除了@符号和空格以外的其它任意符号字符  [^@ ]开头只能是_或者字母  ^[_A-Za-z]长度任意,符号只能包含-_.  [A-Za-z_\-\.]+  或者[A-Za-z_\-\.]{1,}长度在2-5,任意大小写英文  \.([A-Za-z]{2,5})$ ^[_A-Za-z][^@ ]{5,17}@ [A-Za-z_\-\.]+ \.([A-Za-z]{2,5})$ 

 总结

  1. 正则表达式的元字符有很多,我们只需要记一些常用的即可,对于不常用的我就在需要用的时候搜索一下
  2. 判断一个字符是正则表达式还是通配符,我们看用的是什么命令:例如“ls”,看的是文件名用的就是通配符;“grep”,看的是文件内容用的就是正则表达式