1.1 正则表达式介绍
正则表达式(regular expression)是一种文本匹配模式,包括普通字符(例如,a到 z 之间的字母)和特殊字符(称为”元字符”),它是一种字符串匹配的模式,可以用来检查一个字符串是否含有某种子串,将匹配的子串替换或者从某个字符串中取出某个条件的子串。
正则表达式就像数学公式一样,我们可以通过正则表达式提供的一些特殊字符将来生成一个匹配对应字符串的公式,用词来从海量数据中匹配出自己想要的数据。
正则表达式是一个三方产品,被常用计算机语言广泛使用,比如:shell、PHP、PYTHON、java、js等
shell也支持正则表示大师,但不是所有的命令都支持正则表达式,常用的命令中只有 grep、sed、awk 命令支持正则表达式。
并不是 shell 特有的。
特殊说明
测试数据:# cat file
ac
ab
abbc
abcc
aabbcc
abbbc
abbbbbc
acc
abc
asb
aa
bb
a_c
aZc
aAAAAc
a c
ABC
ccc
dddd
http://www
abababab
c c d
123
a3c
e*f
1.2 特殊字符
1.2.1 定位符
定位符使用技巧:
同时锚定开头和结尾,做精确匹配;
单一锚定开头和结尾,做模糊匹配。
定位符 |
说明 |
^ |
锚定开头 ^a 以 a 开头 默认锚定一个字符 |
$ |
锚定结尾 a$ 以 a 结尾 默认锚定一个字符 |
(1)精确匹配 以a开头以c结尾
[root@localhost shell_14]# egrep "^ac$" file
ac
(2)模糊匹配 以 a 开头
[root@localhost shell_14]# egrep "^a" file
ac
ab
abbc
abcc
aabbcc
abbbc
abbbbbc
acc
abc
asb
aa
a_c
aZc
aAAAAc
a c
abababab
a3c
(3)模糊匹配 以 c 结尾
[root@localhost shell_14]# egrep "c$" file
ac
abbc
abcc
aabbcc
abbbc
abbbbbc
acc
abc
a_c
aZc
aAAAAc
a c
ccc
a3c
1.2.2 匹配符
匹配符 |
说明 |
. |
匹配除回车以外的任意字符 |
() |
字符串分组 |
[] |
定义字符类,匹配括号范围内的一个字符 |
[^] |
表示否定括号中出现字符类中的字符,取反 |
\ |
转义字符 |
| |
或 |
(1)精确匹配 a开头c结尾中间为任意一个字符
[root@localhost shell_14]# egrep "^a.c$" file
acc
abc
a_c
aZc
a c
a3c
(2)精确匹配 a开头c结尾中间为0到9的任意一个数字
[root@localhost shell_14]# egrep "^a[0-9]c$" file
a3c
(3)精确匹配 a开头c结尾中间为除了0到9的任意字符
[root@localhost shell_14]# egrep "^a[^0-9]c$" file
acc
abc
a_c
aZc
a c
(4)精确匹配 a开头c结尾中间为*的字符
[root@localhost shell_14]# egrep "^a\*c$" file
a*c
(5)精确匹配 a或b开头c结尾中间
[root@localhost shell_14]# egrep "^(a|b)c$" file
ac
bc
1.2.3 限定符
对前面的字符或者字符串做限定说明
限定符 |
说明 |
* |
某个字符之后加型号表示该字符不出现或出现多次 |
? |
与星号相似,但略有变化,表示该字符出现一次或不出现 |
+ |
与星号相似,表示其前面字符出现一次或多次,但必须出现一次 |
{n,m} |
某个字符之后出现,表示该字符最少n次,最多m次 |
{m} |
正好出现了m次 |
(1)b可以不出现或出现多次
[root@localhost shell_14]# egrep "^ab*c$" file
ac
abbc
abbbc
abbbbbc
abc
(2)b可以不出现或出现一次
[root@localhost shell_14]# egrep "^ab?c$" file
ac
abc
(3)必须有b可以有一次或多次
[root@localhost shell_14]# egrep "^ab+c$" file
abbc
abbbc
abbbbbc
abc
(4)b出现一到五次
[root@localhost shell_14]# egrep "^ab{1,5}c$" file
abbc
abbbc
abbbbbc
abc
(5)b出现三次
[root@localhost shell_14]# egrep "^ab{3}c$" file
abbbc
1.3 POSIX 字符
特殊字符 |
说明 |
[:alnum:] |
匹配任意字符字符 0-9 a-z A-Z |
[:alpha:] |
匹配任意字母,大写或小写 |
[:digit:] |
数字0-9 |
[:graph:] |
非空字符(非空格控制字符) |
[:lower:] |
小写字符a-z |
[:upper:] |
大写字符A-Z |
[:cntrl:] |
控制字符 |
[:print:] |
非空字符(包括空格) |
[:punct:] |
标点符号 |
[:blank:] |
空格和TAB字符 |
[:xdigit:] |
16 进制数字 |
[:space:] |
所有空白字符(新行、空格、制表符) |
只匹配一个字符
[root@localhost shell_14]# egrep "^a[[:alnum:]]c$" file
acc
abc
aZc
a3c
1.4 正则注意事项
- 所有符号英文符号
- 学习正则,通过 grep 命令学习, grep 加上单引号
- 给 grep ,egrep 加上颜色,alias=’grep —color=auto’ alias egrep=’egrep —color=auto’
- 注意系统的字符集: en_US.UTF-8(大部分情况下没问题),如果出现问题修改字符集为C export LANG=C
- 快速掌握正则:配合grep -o 参数学习
1.5 正则 VS 通配符
分类 |
诞生目标(用途) |
支持的命令 |
正则(regular expression) |
三剑客,高级语言,进行过滤(匹配字符) |
三剑客grep,sed,awk find,rename(ubuntu),expr |
通配符(pathname extension 或 glob) |
匹配文件(文件名).txt 。log {01..10} |
Linux 下面大部分命令都支持 |
Shell常见通配符
通配符 |
含义 |
实例 |
* |
匹配 0 或多个字符 |
a*b a与b之间可以有任意长度的任意字符, 也可以一个也没有, 如aabcb, axyzb, a012b, ab。 |
? |
匹配任意一个字符 |
a?b a与b之间必须也只能有一个字符, 可以是任意字符, 如aab, abb, acb, a0b。 |
[list] |
匹配 list 中的任意单一字符 |
a[xyz]b a与b之间必须也只能有一个字符, 但只能是 x 或 y 或 z, 如: axb, ayb, azb。 |
[!list]或[^list] |
匹配 除list 中的任意单一字符 |
a[!0-9]b a与b之间必须也只能有一个字符, 但不能是阿拉伯数字, 如axb, aab, a-b。 |
[c1-c2] |
匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z] |
a[0-9]b 0与9之间必须也只能有一个字符 如a0b, a1b… a9b。 |
[!c1-c2]或[^c1-c2] |
匹配不在c1-c2的任意字符 |
a[!0-9]b 如acb adb |
{string1,string2,…} |
匹配 sring1 或 string2 (或更多)其一字符串 |
a{abc,xyz,123}b 列出aabcb,axyzb,a123b |