shell编程之正则表达式
Posted 锦衣admin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell编程之正则表达式相关的知识,希望对你有一定的参考价值。
shell编程之正则表达式
正则表达式介绍
正则表达式: 是一组特殊符号,通过这些符号可以根据需要匹配内容的格式生成一个公式
作用: 用这个公式将想要的内容全部匹配出来
shell下能使用正则表达式的命令有:grep
、sed
、awk
、vim
、find
限定符
第一套字符
定位符
定位符使用技巧: 同时锚定开头和结尾,做精确匹配;单一锚定开头或结尾,做模糊匹配
定位符 | 描述 |
---|---|
^ | 锚定开头;如:^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 | 某个字符或字符串之后加上,如:ban,m 表示a字符 最少出现n次、最多出现m次 |
m | 与n,m类似,但是表示正好出现m次;如:bcm 表示c字符 正好出现3次 |
.* | 点星组合代表匹配除回车以外所有字符,匹配0次到多次。 |
演示:
n,m
[root@server ~]# egrep "^ab3,5c" re.sh => "a-头,2-(b出现3到5次),b后面必须跟c字符"
abbbc
abbbbc
abbbbc
abbbbbc
abbbbbca
abbbbc
abbbcabbc
abbbc
[root@server ~]# egrep "^ab4,7a" 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 "^ab5c" re.sh => "b必须出现五次,且后面跟c字符"
abbbbbc
abbbbbca
[root@server ~]# egrep "^ab5" 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编程之正则表达式的主要内容,如果未能解决你的问题,请参考以下文章