Shell正则表达式 概述

正则表达式是用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。主要用于模糊匹配。

正则表达式与通配符的区别

正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配。grep、awk、sed等命令可以支持正则表达式

通配符用来匹配符合条件的文件名,通配符是完全匹配。ls、find、cp这些命令不支持正则表达式,所以只能使用shell自己的通配符进行匹配


基础正则表达式

* 前一个字符匹配0次或任意多次
. 匹配除了换行符外任意一个字符
^ 匹配行首。例如^hello会匹配以hello开头的行
$ 匹配行尾。例如hello$会匹配以hello结尾的行
[] 匹配中括号中指定的任意一个字符,只匹配一个字符。[0-9]匹配任意一位数字
[^] 匹配除中括号的字符以外的任意一个字符。
例如:[^0-9]匹配任意一位非数字字符
[^a-z]表示任意一位非小写字母
\ 转义符。用于取消将特殊符号的含义取消
\{n\} 表示其前面的字符恰好出现N次
例如:[0-9]\{4\} 匹配4位数字
[1][3-8][0-9]\{9\} 匹配手机号码
\{n,\} 表示其前面的字符出现不小于n次。 例如 [0-9]\{2,\}表示两位及以上的数字
\{n,m\} 表示其前面的字符至少出现n次,最多出现m次。
例如[a-z]\{6,8\}匹配6到8位的小写字母
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
a* 匹配所有内容,包括空白行
aa* 匹配至少包含有一个a的行
aaa* 匹配最少包含两个连续a的字符串
aaaaa* 匹配最少包含四个连续a的字符串
区别于通配符里的*,通配符里的a*表示以a开头的字符串,这也说明了正则是一种包含匹配
s..d 匹配s和d之间含有2个任意字符(除换行符)行,有多少个点就多少个字符
s.*d 匹配s和d之间含有任意内容的行
.* 匹配所有内容
^s 匹配以s开头的行
n$ 匹配以n结尾的行
^$ 匹配空白行
s[ao]id 匹配s和i字母中,要不是a,要不是o
[0-9] 匹配任意任意一个数字
^[a-z] 匹配用小写字母开头的行
[a-zA-z] 匹配所有字母,shell中不支持[A-z]
^[^a-z] 匹配非小写字母开头的行
^[^a-zA-Z] 匹配非字母开头的行
\.$ 匹配使用.结尾的行
.$ 以任意字符结尾的行
a\{3\} 匹配a字母连续出现三次的字符串
[0-9]\{3\} 匹配包含连续的三个数字的字符串
c\{3\}u 匹配u前面有三个c的字符串
"xc\{3\}u" 匹配x和u之间三个c的字符串,x、u为定界符
**实际使用中也会匹配多于n次的,如果需要准确匹配,则需要在前后使用分隔符**
^[0-9]\{3,\}[a-z] 匹配最少用连续三个数字开头的行
sa\{1,3\}i 匹配在字母s和字母i之间最少一个a,最多三个a
1
2
3
4
5
6
7
正则表达式适合在文档中提取,不适合做写入的判断依据
[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}
匹配日期
^[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}
匹配IP地址