- 本文为慕课网shell编程之正则表达式第一章三到六节关于基础正则表达式的笔记,在此感谢 Tony 老师的讲解。
基础正则表达式
元字符 | 作用 |
---|---|
* | 前一个字符匹配 0 次或任意多次。 |
. | 匹配除了换行符外任意一个字符。 |
^ | 匹配行首。例如:^hello 会匹配以 hello 开头的行。 |
$ | 匹配行尾。例如:hello$ 会匹配以 hello 结尾的行。 |
[] | 匹配中括号中指定的任意一个字符,只匹配一个字符。 例如:[aoeiu]匹配任意一个元音字母,[0-9]匹配任意一位数字,[a-z][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 位的小写字母。 |
? 和 () 是扩展正则
匹配练习参考文件内容:
[root@localhost ~]# vim test.txt
a
aa
aaa
aaaa
aaaaa.
xcu
xccu
xcccu
xccccu
xcccccu
said
soid
suud
sooooood.
12345
5678
7832
bbbbbbbbbb44445bbbb
6aaaaaaaaaaaa
ab
aabb
b
bb
bbb
bbbb
bbbbb
“*”前一个字符匹配 0 次,或任意多次
“a*”
- #匹配所有内容。包括空白行
“aa*”
- #匹配至少包含有一个 a 的行
“aaa*”
- 匹配最少包含两个连续 a 的字符串
“aaaaa*”
- #匹配最少包含四个连续 a 的字符串
“.”匹配除了换行符外的任意一个字符
“s..d”
- #“s..d”会匹配在 s 和 d 这两个字母之间一定有两个字符的字符串
“s.*d”
- #匹配在 s 和 d 字母之间有任意字符的字符串
“.*”
- #匹配所有内容
“^”匹配行首,“$”匹配行尾
“^M”
- #匹配以大写“M”开头的行
“n$”
- #匹配以“n”结尾的行
“^$”
- #匹配空白行
“[]”匹配中括号中指定的任意一个字符,只匹配一个字符
“s[ao]id”
- #匹配 s 和 i 字母中的任意一个字符,要么是 a,要么是 o
“[0-9]”
- #匹配任意一个数字
“^[a-z]”
- #匹配用小写字母开头的行
“[^]”匹配除中括号的字符以外的任意一个字符
“^[^a-z]”
- #匹配不用小写字母开头的行
“^[^a-zA-Z]”
- #匹配不用大写或小写字母开头的行
- #在 php 中可以用“^[^A-z]”匹配不用大写或小写字母开头的行,因为在 php 语言中,大写字母排在小写字母前面,但在 Linux 中不行
“\”转义符
“\.$”
- #匹配使用“.”结尾的行
- #“.$”匹配以任意字符结尾的行
“\{n\}”表示其前面的字符恰好出现 n 次,若没有加定界符,则会匹配 n 次及 n 次以上
“a\{3\}”
- #匹配 a 字母连续出现三次的字符串,包含了三次以上
“xc\{3\}u”
- #匹配 x 和 u 之间恰好出现三次 c 的字符串,x 和 u 为定界字符
“[0-9]\{3\}”
- #匹配包含连续的三个数字的字符串,恰好匹配需要定界符
“\{n,\}”表示其前面的字符出现不小于 n 次
“^[0-9]\{3,\}[a-z]”
- #匹配最少用连续三个数字开头的行
“\{n,m\}”匹配其前面的字符至少出现 n 次,最多出现 m 次
“xc\{2,3\}u”
- #匹配在字母 x 和字母 u 之间有最少一个 c,最多三个 c
例子:
grep “[0-9]\{4\}-[0-9]{2\}-[0-9]{2\}” 文件
- 从文档中匹配规范的日期格式
grep “[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}”
- #从文档中向外提取 ip 地址,但并不是精确匹配 ip