正则表达式

什么是正则表达式

正则表达式(Regular Expression)就是使用简单的字符安装预先设定的规则来完成复杂的功能,正则表达式实际上是一个匹配的模板,当bash执行到正则表达式时会将所有的输入数据与匹配模板进行比较,符合规则的就匹配成功。

正则表达式的分类

在Linux系统中,不同的语言使用不同的正则表达式,而正则表达式的类型由正则表达式引擎控制,正则表达式引擎负责解析正则表达式的匹配规则以及使用方式,一般的,正则表达式引擎可分为POSIX基本正则表达式和POSIX扩展正则表达式,前者在Linux大多数应用程序环境都能使用,下面主要是针对基本正则表达式来讲解。

基本正则表达式的常用符号

正则表达式一般用于匹配文本内容,如grep 中使用,其常用符号如下:

点. :点是英文符号的点,表示能够匹配一个任意字符,包含空格符号;
*号 :匹配前面的子表达式零次或多次;
^string :表示匹配行首是以string字符串开头的,不管后面有没有字符不关心(注意说的是行首中的字符串是以string开头);
string$ :表示匹配行尾,是以string字符串结尾的;
想要匹配空行,那就是匹配没有任何字符的行,那就是 ^$ ,在shell脚本中,每一行都默认有一个$符号结尾;
\ :斜杠表示取消特殊字符的转译功能,仅把特殊字符当做普通字符处理;

演示示例:
[root@Centos8 ~]# cat file -E -n #源文件
1 file1$
2 file2$
3 file3$
4 file4$
5 file5$
6 file$
7 $
8 test$
9 test1$
10 test2$
11 test3$
12 test4$
13 test5$
14 file $
15 $
16 test6 file10$
说明:如上所示file源文件内容共有16行,第7和第15行是空行,第6行和14行内容都是字符串file,但第14行是字符串后面还有一个空格的;

[root@Centos8 ~]# grep “file.” file #点符号匹配一个字符,其中匹配到了源文件中第14行,因为第14行是字符串后面还有一个空格的;
file1
file2
file3
file4
file5
file
test6 file10
[root@Centos8 ~]# grep “file*” file #星号匹配0个或多个任意字符
file1
file2
file3
file4
file5
file
file
test6 file10
[root@Centos8 ~]# grep “^file” file #匹配行首是file开头的,源文件第16行不是file开头的行首并没有匹配
file1
file2
file3
file4
file5
file
file
[root@Centos8 ~]# grep “e$” file #匹配行尾结尾是e结尾的,只匹配了第6行,源文件中的第14行没有被匹配
file

[root@Centos8 ~]# grep “^$” file|cat -n #查看文件中是否存在空行
1
2
[root@Centos8 ~]#

基本正则表达式的常用符号

[n-m] :中括号,中杠表示连续的意思,整个含义是表示匹配n-m之间连续的字符或数字中的任意一个,如[a-c] 就表示了能匹配a或b或c就行,[0-3]就表示匹配数字0123任意一个就行;
{} :在上面讲的常用符号中,只要有一次匹配成功就返回成功,而{}是用来匹配连续多个指定字符成功才返回成功的符号,{}有三种使用方式,
第一种、string{n} 表示匹配string字符串连续出现的此数为n次,则匹配成功,不连续或次数不足则匹配失败;
第二种、string{n}m 表示string字符串连续出现的次数最少为n次;
第三种、string{n,m} 表示string字符串连续出现的次数要在n到m之间,含等于;
?:问号,匹配前面的子表达式零次或一次;

演示示例:
[root@Centos8 ~]# cat -n file #源文件
1 file1
2 file2
3 apache
4 bana
5 cju
6 kiabc
7 1234
8 879
9 5647
10 230
11 309
12 908
13 789
[root@Centos8 ~]# grep “[a-c]” file #匹配含有abc字符中的任意一个的行
apache
bana
cju
kiabc
[root@Centos8 ~]# grep “[7-9]” file ##匹配含有789数字中的任意一个的行
879
5647
309
908
789
[root@Centos8 ~]# cat file -n #源文件
1 file1ekiee
2 file2ejeee
3 apache
4 banaakjakiijaaga
5 cjukukjkunusu
6 kiabckijhifui
7 1234
8 879
9 5647
10 230
11 309
12 908
13 789
[root@Centos8 ~]# grep “e{3}” file #匹配e字母连续出现3次,只有源文件第2行匹配
file2ejeee
[root@Centos8 ~]# grep “e{1,3}” file #匹配字符e最少出现1次,最多出现3次
file1ekiee
file2ejeee
apache
[root@Centos8 ~]# cat -n file #源文件
1 apache
2 apche
3 apaache
[root@Centos8 ~]# grep “apa?che” file #需要使用斜杠
apache
apche

更多内容

正则表达式比较复杂,更多内容请参考https://www.runoob.com/regexp/regexp-syntax.html

上一篇:odp


下一篇:1.linux中以rpm包的方式安装mysql