二十一、正则表达式

king's blog
linux下不是所有的工具都支持正则表达式,比如vi、sed、awk、grep都支持;但cp、ls等就不支持,则只能使用bash的通配符,熟悉linux的人都知道,正则表达式非常重要,为什么这么说,因为正则表达式不仅能提供工作效率,还能处理比较复杂的场景,那本节我们来了解下正则表达式,该节主要内容如下:
一、普通正则表达式(Regular Expression)
二、延伸正则表达式

一、普通正则表达式(Regular Expression)

普通正则表达式,简单来说,就是处理字符串的方法,以行为单位进行字符串的处理行为,通过一些特殊符号的辅助,可以轻易的达到搜索/删除/替换特定字符串的处理程序。支持正则表达式的工具,常用的vi,grep,awk,sed等等。主要注意的是,cp,ls不支持正则表达式,只能使用bash的通配符。

正则表达式中支持的特殊符号如下:

  1. [:alnum:] : 代表英文大小写字符及数字,即0-9 & A-Z & a-z
  2. [:alpha:] : 代表任何英文大小写字符,即A-Z & a-z
  3. [:lower:] :代表小写字符,即a-z
  4. [:upper:] : 代表大写字符,即A-Z
  5. [:digit:] :代表数字而已,即0-9
  6. [:blank:] : 代表空格键和[Tab]键
  7. [:cntrl:] :代表键盘上的控制按键,即CR、LF、Tab、Del…等等
  8. [:graph:] : 代表除空格键和[Tab]键外的其他所有按键
  9. [:print:] : 代表任何可以被打印出来的字符
  10. [:punct:] : 代表标点符号,即: ” ‘ ? ! ; : # $等等
  11. [:space:] : 代表任何会产生空白的字符,包括空格键,Tab键,CR等等
  12. [:xdigit:] : 代表16进位的数字类型,包括0-9、A-F、a-f

正则表达式中支持的普通符号如下:

  1. ^ : 表示待搜索的字符串在行首
  2. $ : 表示待搜索的字符串在行尾
  3. . : 代表一定有一个任意字符
  4. * : 代表重复0次或多次前一个RE(Regular Expression)字符
  5. \ : 代表转义字符,也就是将有特殊含义的字符当成普通字符
  6. [list] : 代表list里的任意一个字符而且是必须有一个,比如1[ac],代表1a,1c
  7. [n1-n2]: 代表n1-n2中的任意一个字符而且是必须有一个,比如1[a-c],代表1a,1b,1c
  8. [^list]: 代表反向,也就是不在list内的任意一个字符而且是必须有一个
  9. \{n,m\}: 代表连续n到m个前一个RE字符,比如a\{2,3\},表示2-3个a,即代表aa,aaa

这里需要注意的是,*在正则表达式和通配符中代表含义完全不同
*:正则表达式中,代表重复0次或多次前一个RE(Regular Expression)字符
*:在通配符中,代表0到多个任意字符

例子1:普通字符的正则表达式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#演示的文本内容(不包括行号)
weblogic@ETS157:~> cat -n regualar_expression.txt
     1  China
     2  1111
     3  2222
     4  like
     5
     6  love
     7
     8  like china\
     9  1abcabcabc3.
    10  abc3abc
    11  Lia
    12  Lc
    13  liabbb
    14  liabb
    15  liab
    16  liac
    17  3a3a
    18  !!!
    19  A3A

#1.搜索行首为1的行
weblogic@ETS157:~> grep -n '^l' regualar_expression.txt
4:like
6:love
8:like china\
13:liabbb
14:liabb
15:liab
16:liac


#2.搜索行尾以e结尾的行
weblogic@ETS157:~> grep -n 'e$' regualar_expression.txt
4:like
6:love


#3.搜索空行(常用)
weblogic@ETS157:~> grep -n '^$' regualar_expression.txt
5:
7:

#4.搜索lia后一个任意字符的行
weblogic@ETS157:~> grep -n 'lia.' regualar_expression.txt
13:liabbb
14:liabb
15:liab
16:liacbb


#5.搜索lia后,紧接着不含b,或1个b',或连续几个b的行
weblogic@ETS157:~> grep -n 'liab*' regualar_expression.txt
13:liabbb
14:liabb
15:liab
16:liac

#6.搜索含\的行
weblogic@ETS157:~> grep -n '\' regualar_expression.txt
8:like china\


#7.搜索含liab or liac的行
eblogic@ETS157:~> grep -n 'lia[bc]' regualar_expression.txt
13:liabbb
14:liabb
15:liab
16:liac

#8.搜索li后接任意一个小写字母的行
weblogic@ETS157:~> grep -n 'li[a-z]' regualar_expression.txt
4:like
8:like china\
13:liabbb
14:liabb
15:liab
16:liac

#9.搜索不含lib or lic的行
weblogic@ETS157:~> grep -n 'li[^bc]' regualar_expression.txt
4:like
8:like china\
13:liabbb
14:liabb
15:liab
16:liac


#10.搜索含bb or bbb的行
weblogic@ETS157:~> grep -n 'b\{2,3\}' regualar_expression.txt
13:liabbb
14:liabb

例子2:特殊字符的正则表达式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#1.搜索含特殊字符的行
weblogic@ETS157:~> grep -n '[[:punct:]]' regualar_expression.txt
8:like china\
9:1abcabcabc3.
18:!!!


#2.搜索带空格的行
weblogic@ETS157:~> grep -n '[[:space:]]' regualar_expression.txt
8:like china\

#3.搜索1个大写字母后面跟1个任意数字的行
weblogic@ETS157:~> grep -n '[[:upper:]][[:digit:]]' regualar_expression.txt
19:A3A

二、延伸正则表达式

延伸正则表达式,也是处理字符串的方法,只是没普通正则表达式严谨而已。它除了能处理简单的一组字符串之外,还能处理群组的字符串。比如,通常借助(,|等字符来处理or关系的字符串。

延伸正则表达式支持的特殊字符如下:

  1. + : 代表重复一个或一个以上的前一个RE字符
  2. ? : 代表0个或1个前一个RE字符
  3. | : 代表用或(or)的方式找出数个字符串
  4. () : 代表找出群组字符串,比如:egrep ‘l(ik|ov)e’ a.txt ,表示在a.txt文件中搜索含like or love字符串的行
  5. ()+: 代表多个群组的判别,比如: egrep ‘(abc)+’ a.txt,表示在a.txt文件中搜索含多个连续abc的行

需要注意,延伸正则表达式的特殊字符,grep不支持,但在egrep中支持
例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#待搜索的文件内容
weblogic@ETS157:~> cat a.txt
1 China
2 1111
3 2222
4 like
5 love
6 like china
7 1abcabcabc3
8 abc3abc

#1.搜索1个或多个含数字1的行
weblogic@ETS157:~> egrep '1+' a.txt
1 China
2 1111
7 1abcabcabc3

#2.搜索至少含0个或1个数字1的行,相当于把所有行打印出来
weblogic@ETS157:~> egrep '1?' a.txt
1 China
2 1111------------->特殊
3 2222
4 like
5 love
6 like china
7 1abcabcabc3
8 abc3abc

#3.搜索多个字符串
weblogic@ETS157:~> egrep 'l(ik|ov)e' a.txt
4 like
5 love
6 like china

#4.搜索多个连续的字符
weblogic@ETS157:~> egrep '(1)+' a.txt
1 China
2 1111
7 1abcabcabc3

#5.搜索多个连续的字符串
weblogic@ETS157:~> egrep '(11)+' a.txt
2 1111

#6.搜索多个连续的字符串
weblogic@ETS157:~> egrep '(abc)+' a.txt
7 1abcabcabc3
8 abc3abc
Tags:
文 / 甲乙丙丁
LEAVE A REPLY

loading