正则表达式
正则表达式(Regular EXPression,REGEXP),被很多程序和开发语言所广泛支持:vim, less,grep,sed,awk, nginx,mysql 等
正则表达式引擎:
采用不同算法,检查处理正则表达式的软件模块,如:PCRE(Perl Compatible Regular
Expressions),默认正则表达式是贪婪模式匹配,尽可能长匹配
正则表达式的元字符分类:字符匹配、匹配次数、位置锚定、分组
字符匹配
. 匹配任意单个字符
[] 匹配指定范围内的任意单个字符,示例:[wang] [0-9] [a-z] [a-zA-Z]
[^] 匹配指定范围外的任意单个字符,示例:[^wang]
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:] 十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
范例
#匹配/etc/中以rc开头,后接0个或一个数字的文件或目录文件
[root@centos8 ~]#ls /etc/ | grep "rc[.0-9]"
[root@centos8 ~]#ls /etc/ | grep "rc[.0-9]"
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d
rc.d
rc.local
#匹配/etc/中以rc开头,后以.d结尾,中间是. 或数字的文件或目录文件
[root@centos8 ~]#ls /etc/ | grep "rc[.0-9].d"
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d
匹配次数
用在要指定次数的字符后面,用于指定前面的字符要出现的次数。
* 匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
.* 任意长度的任意字符
\? 匹配其前面的字符0或1次,即:可有可无
\+ 匹配其前面的字符至少1次,即:肯定有
\{n\} 匹配前面的字符n次
\{m,n\} 匹配前面的字符至少m次,至多n次
\{,n\} 匹配前面的字符至多n次
\{n,\} 匹配前面的字符至少n次
ps:扩展正则表达式中,不需要转义符\ ,如\? 在扩展表达式中,是?
范例
[root@centos8 ~]#cat google.txt
ggle
gogle
google
goooooooooooogle
gooOOOOgle
goooogle
[root@centos8 ~]#cat google.txt | grep "go\?"
[root@centos8 ~]#cat google.txt | grep "go\+"
位置锚定
位置锚定可以用于定位出现的位置
^ 行首锚定,用于模式的最左侧
$ 行尾锚定,用于模式的最右侧
^PATTERN$ 用于模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行
\< 或 \b 词首锚定,用于单词模式的左侧
\> 或 \b 词尾锚定,用于单词模式的右侧
\<PATTERN\> 匹配整个单词
#ps:
#1.PATTERN是模式匹配
#2.单词是由字母,数字,下划线组成
范例
[root@centos8 ~]#cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sun Aug 2 09:55:22 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
UUID=821ca9f0-c339-4d0a-9258-806b87fe9e5d / xfs defaults 0 0
UUID=75cbd81a-7230-4f4a-a2d7-7119754f7f7e /boot ext4 defaults 1 2
UUID=ab7a6930-42ca-4dcb-8f8e-cffda571867c /data xfs defaults 0 0
UUID=fbfef6d8-5c65-489f-bc7e-cb5d2055c9aa swap swap defaults 0 0
#获取/etc/fstab 中不以# 开头的内容
[root@centos8 ~]#grep '^[^#]' /etc/fstab
UUID=821ca9f0-c339-4d0a-9258-806b87fe9e5d / xfs defaults 0 0
UUID=75cbd81a-7230-4f4a-a2d7-7119754f7f7e /boot ext4 defaults 1 2
UUID=ab7a6930-42ca-4dcb-8f8e-cffda571867c /data xfs defaults 0 0
UUID=fbfef6d8-5c65-489f-bc7e-cb5d2055c9aa swap swap defaults 0 0
#查看/etc/profile 共有多少行内容
[root@centos8 ~]#wc -l /etc/profile
85 /etc/profile
#获取/etc/profile中除空行以外有多少行
[root@centos8 ~]#grep -v '^$' /etc/profile | wc -l
73
#获取/etc/profile中除#开头,空行外有多少行
[root@centos8 ~]#grep '^[^$#]' /etc/profile |wc -l
61
分组其他
分组:() 将一个或多个字符捆绑在一起,当作一个整体处理,如:\(root\)+
分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, …
\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
范例
执行前
#将l..e这种格式(如like,love)后追加r
%s@\(l..e\)@\1r@g
执行后
#将l..e这种格式(如like,love)替换成1r
%s#\(l..e\)#1r#g
执行后
后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身
或的关系 用 | 表示
a|b a或b
C|cat C或cat
(C|c)at Cat或cat