什么是正则表达式
正则表达式:REGEXP,REGular EXPression。
正则表达式分为两类:
Basic REGEXP(基本正则表达式)
Extended REGEXP(扩展正则表达式)
在这//元字符
. //匹配任意单个字符
[root@localhost tmp]# ls
1 2 3 4 5 6 7 8 9 a abc bcd z Z
[root@localhost tmp]# ls |grep '^.$'
1
2
3
4
5
6
7
8
9
a
z
Z
//[] //匹配指定范围内的任意单个字符
[root@localhost tmp]# ls
1 14 2 25 30 36 41 47 52 58 63 69 74 8 85 90 96 b g m s y
10 15 20 26 31 37 42 48 53 59 64 7 75 80 86 91 97 bcd h n t z
100 16 21 27 32 38 43 49 54 6 65 70 76 81 87 92 98 c i o u Z
11 17 22 28 33 39 44 5 55 60 66 71 77 82 88 93 99 d j p v
12 18 23 29 34 4 45 50 56 61 67 72 78 83 89 94 a e k q w
13 19 24 3 35 40 46 51 57 62 68 73 79 84 9 95 abc f l r x
[root@localhost tmp]# ls |grep '^[1-3a-c]$'
1
2
3
a
b
c
[^] //匹配指定范围外的任意单个字符
[root@localhost tmp]# ls |grep '^[^1-3a-c]$' //除了1-3和a-c不匹配,其他的都匹配
4
5
6
7
8
9
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
Z
[root@localhost tmp]#
//匹配次数(贪婪模式)
* //匹配其前面的任意单个字符任意次
[root@localhost tmp]# ls |grep '^ab*$'
a
ab
abb
abbb
abbbb
.* //任意长度的任意字符
[root@localhost tmp]# ls |grep '^ab.*$'
ab
abb
abbb
abbbb
abc
\? //匹配其前面的任意单个字符1次或0次
[root@localhost tmp]# ls |grep '^ab\?$'
a
ab
\+ //匹配其前面的任意单个字符至少1次
[root@localhost tmp]# ls |grep '^ab\+$'
ab
abb
abbb
abbbb
\{m,n\} //匹配其前面的任意单个字符至少m次,至多n次
[root@localhost tmp]# ls |grep '^ab\{1,3\}$' //最少匹配1次,之多匹配3
此
ab
abb
abbb
//位置锚定
^ //锚定行首,此字符后面的任意单个字符必须出现在行首
[root@localhost tmp]# ls |grep '^a'
a
ab
abb
abbb
abbbb
abc
$ //锚定行尾,此字符前面的任意单个字符必须出现在行尾
[root@localhost tmp]# ls |grep 'b$'
ab
abb
abbb
abbbb
b
^$ //空白行
[root@localhost tmp]# cat a
hello adha kdak dhas askjdskad
ad ad ad adadadbulaike
[root@localhost tmp]# grep ^$ a //匹配空白行
[root@localhost tmp]# grep -v ^$ a //-v取反,不匹配空白行
hello adha kdak dhas askjdskad
ad ad ad adadadbulaike
\<或\b //锚定词首,其后面的任意单个字符必须作为单词首部出现
\>或\b //锚定词尾,其前面的任意单个字符必须作为单词尾部出现
[root@localhost tmp]# cat a
hello adha kdak dhas askjdskad
ad ad ad adadadbulaike
[root@localhost tmp]# grep '\<h' a
hello adha kdak dhas askjdskad
[root@localhost tmp]# grep 'd\>' a
hello adha kdak dhas askjdskad
ad ad ad adadadbulaike
/分组
\(\)
例:\(ab\)*
//后向引用
\1 //引用第一个左括号以及与之对应的右括号所包括的所有内容
\2 //引用第二个左括号以及与之对应的右括号所包括的所有内容
[root@192 tmp]# cat a
hello heipi hello bulaike hello nigger
hello runtime world
[root@192 tmp]# sed 's/hello \(.*\) \(.*\)/hello \2 \1/' a
hello nigger heipi hello bulaike hello
hello world runtime
扩展正则表达式
在这里插//字符匹配
//. //匹配任意单个字符
[root@localhost tmp]# ls |egrep '^.$'
1
2
3
4
5
6
7
8
9
a
b
//[] //匹配指定范围内的任意单个字符
[root@localhost tmp]# ls |egrep '^[15-9a-cz]$'
1
5
6
7
8
9
a
b
c
z
//[^] //匹配指定范围外的任意单个字符
[root@localhost tmp]# ls |egrep '^[^15-9a-cz]$'
2
3
4
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
Z
//次数匹配
//* //匹配其前面的任意单个字符任意次
[root@localhost tmp]# ls |egrep '^ab*$'
a
ab
abb
abbb
abbbb
//? //匹配其前面的任意单个字符1次或0次
[root@localhost tmp]# ls |egrep '^ab?$'
a
ab
+ //匹配其前面的任意单个字符至少1次
[root@localhost tmp]# ls |egrep '^ab+$'
ab
abb
abbb
abbbb
// {m,n} //匹配其前面的任意单个字符至少m次,至多n次
[root@localhost tmp]# ls |egrep '^ab{1,4}$'
ab
abb
abbb
abbbb
//位置锚定
// ^ //锚定行首,此字符后面的任意单个字符必须出现在行首
[root@localhost tmp]# egrep '^hello' a
hello heipi hello bulaike hello nigger
hello runtime world
// $ //锚定行尾,此字符前面的任意单个字符必须出现在行尾
[root@localhost tmp]# cat a
hello heipi hello bulaike hello nigger
hello runtime world
[root@localhost tmp]# egrep 'world$' a
hello runtime world
// ^$ //空白行
[root@localhost tmp]# cat a
hello heipi hello bulaike hello nigger
hello runtime world
[root@localhost tmp]# egrep ^$ a //匹配空白行
[root@localhost tmp]# egrep -v ^$ a //不匹配空白行-v取反
hello heipi hello bulaike hello nigger
hello runtime world
// \<或\b //锚定词首,其后面的任意单个字符必须作为单词首部出现
[root@localhost tmp]# cat a
hello heipi hello bulaike helloasdasd nigger
hello runtime world
[root@localhost tmp]# egrep '\bhello' a
hello heipi hello bulaike helloasdasd nigger
hello runtime world
\>或\b //锚定词尾,其前面的任意单个字符必须作为单词尾部出现
[root@localhost tmp]# cat a
hello heipi hello bulaike helloasdasdhello nigger
hello runtime world
[root@localhost tmp]# egrep 'hello\b' a
hello heipi hello bulaike helloasdasdhello nigger
hello runtime world
//分组
() //分组
\1,\2,\3,....
例:(ab)*
//后向引用
\1 //引用第一个左括号以及与之对应的右括号所包括的所有内容
\2 //引用第二个左括号以及与之对应的右括号所包括的所有内容
[root@localhost tmp]# cat a
hello heipi hello bulaike helloasdasdhello nigger
hello runtime world
[root@localhost tmp]# sed -r 's/(hello) (.*) (.*)/\3 \1 \2/' a //-r是支持扩展正则表达式的选项
nigger hello heipi hello bulaike helloasdasdhello
world hello runtime
第一个左括号以及与之对应的右括号所包括的所有内容
\2 //引用第二个左括号以及与之对应的右括号所包括的所有内容
[root@localhost tmp]# cat a
hello heipi hello bulaike helloasdasdhello nigger
hello runtime world
[root@localhost tmp]# sed -r 's/(hello) (.*) (.*)/\3 \1 \2/' a //-r是支持扩展正则表达式的选项
nigger hello heipi hello bulaike helloasdasdhello
world hello runtime