shell编程之正则表达式

Posted 锦衣admin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell编程之正则表达式相关的知识,希望对你有一定的参考价值。

正则表达式介绍

正则表达式: 是一组特殊符号,通过这些符号可以根据需要匹配内容的格式生成一个公式

作用: 用这个公式将想要的内容全部匹配出来

shell下能使用正则表达式的命令有grepsedawkvimfind

限定符

第一套字符

定位符

定位符使用技巧: 同时锚定开头和结尾,做精确匹配;单一锚定开头或结尾,做模糊匹配

定位符描述
^锚定开头;如:^a,表示以a开头。默认锚定一个字符
$锚定结尾;如:a$,表示以a结尾。默认锚定一个字符

演示:

[root@server ~]# egrep "^a" re.sh		=>	"匹配以a开头的字符"
	a.
	a
	ac
	ab
	ac
	abb
	abc
	aab
	aac
	a_b
	acc
	aac

[root@server ~]# egrep "^a$" re.sh		=>	"匹配单一a字符"
	a

[root@server ~]# egrep "^ab" re.sh		=>	"匹配以a开头,第二个是b的字符"
	ab
	abb
	abc

[root@server ~]# egrep "^ab$" re.sh		=>	"匹配a开通,b结尾的字符"
	ab

[root@server ~]# egrep "a$" re.sh		=>	"匹配a结尾的字符"
	a
	*a
	bba
	b_a
	bca
	bba

[root@server ~]# egrep -n "^$" re.sh	=>	"匹配空行"
	3:
	8:

匹配符

匹配符描述
.匹配除回车以外任意一个字符
()字符串分组。多个字符括起来指定。注意:不能做范围选择,即不能(a-z)这样
[]定义字符类,只能匹配一个字符。通过[]定义一个范围的字节匹配,可以用[0-9a-zA-Z]表示
[^]否定括号中字符类出现的字符。取反的意思
\\转义字符
|或。必须与()配合使用

演示:

.

[root@server ~]# egrep  "^a." re.sh		=>	"匹配a开通且至少两个字符"
	a.
	ac
	ab
	ac
	abb
	abc
	aab
	aac
	a_b
	acc
	aac
[root@server ~]# egrep  "^a.b" re.sh	=>	"a-头,2-任意,3-b的字符"
	abb
	aab
	a_b
[root@server ~]# egrep  "^.b" re.sh		=>	"任意-头,2-b的字符"
	ab
	abb
	abc
	bba
	bba

()

[root@server ~]# egrep  "^(ab)" re.sh		=>	"ab-头"
	ab
	ab
	abb
	abc
[root@server ~]# egrep  "^(ab)." re.sh		=>	"ab-头,3任意"
	abb
	abc
[root@server ~]# egrep  "^(abc)" re.sh		=>	"abc-头"
	abc

[]

[root@server ~]# egrep  "^a[0-9a-zA-Z]b" re.sh		=>	"a-头,2-(0到9、a到z、A到Z任意一个),3-b"
	abb
	aab
	a8b
[root@server ~]# egrep  "^a[0-9a-zA-Z]." re.sh		=>	"a-头,2-(0到9、a到z、A到Z任意一个),3-任意"
	abb
	abc
	aab
	aac
	acc
	aac
	aBc
	a333c
	a8b
	a6a
[root@server ~]# egrep  "^a[0-9a-zA-Z]c" re.sh		=>	"a-头,a-头,2-(0到9、a到z、A到Z任意一个),3-c"
	abc
	aac
	acc
	aac
	aBc
[root@server ~]# egrep  "^[a,b\\*]" re.sh		=>	"以a或b或\\或*开头"
	a.
	b*
	a
	aab
	*a
	bba
	a6a
	a\\b\\c
	b
	a*b
	\\ab

[^]

[root@server ~]# egrep  "^a[0-9]." re.sh
	a333c
	a8b
	a6a
[root@server ~]# egrep  "^a[^0-9]." re.sh		=>	"a-头,2-不是数字0到9"
	abb
	abc
	aab
	aac
	a_b
	acc
	aac
	aBc
[root@server ~]# egrep  "^a[^0-9a-z]." re.sh	=>	"a-头,2-不是数字也不是小写字符"
	a_b
	aBc

\\

[root@server ~]# egrep  "^a*" re.sh
	a.
	b*
	
	a
	ac
	ab
	ac
	ab
	abb
	abc
	aab
	*a
	bba
	aac
	b_a
	a_b
	b_c
	acc
	bca
	bba
	aac
	aBc
	a333c
	a8b
	a6a
	a\\b\\c
	
	a\\b
	a*b
[root@server ~]# egrep  "^a\\*" re.sh	=>	"转义星号,将其转义成字符串"
	a*b
[root@server ~]# egrep  "^a\\." re.sh	=>	"转义.  将其转义成字符串,而不是匹配任意字符"
	a.

|

[root@server ~]# egrep  "^(b|c)b" re.sh		=>	"b或c-头,2-b"
	bba
	bba
[root@server ~]# egrep  "^(b|c)a" re.sh		=>	"a或c-头,2-a"
	ca
	cab
	cac

限定符字符

限定符: 对前面的字符或者字符串出现的次数做限定说明

限定符描述
*某个字符或字符串之后加星号,如:ca* 表示a可以出现0次或多次
?与星号类似,如:cb? 表示b可以出现0次或1次
+与星号类似,如:ac+ 表示c出现1次或多次,c字符至少出现1次
{n,m}某个字符或字符串之后加上,如:ba{n,m} 表示a字符最少出现n次、最多出现m次
{m}与{n,m}类似,但是表示正好出现m次;如:bc{m} 表示c字符正好出现3次
.*点星组合代表匹配除回车以外所有字符,匹配0次到多次。

演示:

{n,m}

[root@server ~]# egrep  "^ab{3,5}c" re.sh	=>	"a-头,2-(b出现3到5次),b后面必须跟c字符"
	abbbc
	abbbbc
	abbbbc
	abbbbbc
	abbbbbca
	abbbbc
	abbbcabbc
	abbbc
[root@server ~]# egrep  "^ab{4,7}a" re.sh		=>	"a-头,2-(b出现4到7次),b后面必须跟a字符"
	abbbbbba

[root@server ~]# egrep  "^(ab){2,4}" re.sh		=>	"ab字符串最少出现2次,最多出现4次"
	ababababababab
	ababababab
	abababababa

{m}

[root@server ~]# egrep  "^ab{5}c" re.sh		=>	"b必须出现五次,且后面跟c字符"
	abbbbbc
	abbbbbca
[root@server ~]# egrep  "^ab{5}" re.sh		=>	"b必须出现五次,后面出现字符随意"
	abbbbbbc
	abbbbbbc
	abbbbbc
	abbbbbca
	abbbbbba
	abbbbb
	
[root@server ~]# egrep  "^(ab){7}$" re.sh		=>	"表示ab开头,出现七次,必须ab结尾"
	ababababababab

第二套

POSIX 字符

posix字符用于匹配一个范围,一次匹配一个字符

注意[[]] 第一个中括号是匹配符[],第二个中括号为POSIX字符。如:[[:digit:]]表示匹配0-9范围内字符一次

特殊字符描述
[:alnum:]匹任意数字和字母字符,如:0-9、a-z、A-Z
[:alpha:]任意字母,大写或小写
[:digit:]数字 0-9
[:graph:]非空字符 (非空格控制字符)
[:lower:]小写字母 a-z
[:upper:]大写字母 A-Z
[:cntrl:]控制字符
[:print:]非空字符(包括空格)
[:punct:]标点符号
[:blank:]空格和TAB字符
[:xdigit:]十六进制数字
[:space:]所有空白字符(新行、空格、制表符)

以上是关于shell编程之正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

Shell编程三剑客之grep

shell脚本编程之正则表达式(扩展正则表达式sed)

shell编程之正则表达式

shell编程之正则表达式

Shell编程之正则表达式

05 shell编程之正则表达式