正则表达式介绍
正则表达式是一种文本模式匹配,包括普通字符和特殊字符,它是一种字符串匹配模式,可以用来检查一个字符串是否含有某种子串,将匹配的子串替换或者从某个字符串中取出某个条件的子串。
shell也支持正则表达式,但不是所有命令都支持正则表达式,常见的命令只有grep、sed、awk命令支持正则表达式。
示例:数据源 vim file
特殊字符
^ 锚定开头 ,^a表示以a开头,默认锚定一个字符
$ 锚定结尾,a$以a结尾,默认锚定一个字符
测试案例:egrep是增强版的grep命令,也支持正则表达式
1> egrep "^ac$" file 精确匹配,匹配以a开头以c结尾的字符串
2> egrep "^a" file 模糊匹配,匹配以a开头的字符串
匹配符:匹配字符串
. 匹配除回车以外的任意字符
() 字符串分组
[ ] 定义字符串,匹配括号中的一个字符
[^] 表示否定括号中出现字符类中的字符,取反
\ 转义字符
| 或者
测试案例
1> egerp "^a.c$" file 匹配以a开头,c结尾,中间任意一个字符的字符串
2> egrep "^a[0-9]c$" file 匹配以a开头,c结尾,中间任意一个0-9的数字的字符串
3> egrep "^a[^0-9]c$" file 匹配以a开头,c结尾,中间任意一个不为0-9的字符的字符串
4> 往file中先添加一个数据源 a*c echo a*c >> file
egerp "^a\*c$" file 表示匹配a*c
5> egrep "^(a|b)c$" file 表示匹配以a或者b开头,以c结尾的字符串
限定符:对前面的字符或者字符串中做限定说明
* 某个字符之后加星号表示该字符不出现或者出现多次
? 与星号相似,表示该字符出现一次或者不出现
+ 与星号相似,表示其前面字符出现一次或者多次,但是必须出现一次
{n,m} 某个字符之后出现,表示这个字符至少出现n次,最多出现m次
{m} 正好出现了m次
测试案例
1> egerp "^ab*c$" file 表示匹配以a开头,以c结尾,中间b出现0次或者多次的字符串
2> egrep "^ab?c$" file
3> egrep "^ab+c$" file
4> egrep "^ab{2,5}c$" file
5> egrep "^ab{3}c$" file
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:] 所有空白字符(新行、空格、制表符)
注意:[[ ]] 双中括号的意思,第一个中括号是匹配符[ ],匹配中括号中任意一个字符,第二个[ ]是格式,如[:digit:]。
测试案例:
1> egrep "^a[[:alnum:]]c$" file
2> egrep "^a[[:upper:]]c$" file
3> egrep "^a[[:lower:]]c$" file
4> egrep "^a[[:digit:]]c$" file
5> egrep "^a[[:lower:]]*c$" file
学习视频: