Linux系统开发: linux下正则表达式

2022-01-27 20:10:52 浏览数 (1)

1.1 正则表达式介绍

正则表达式就是为了处理大量的文本|字符串而定义的一套规则和模板。

通过定义的这些特殊符号的辅助,系统管理员就可以快速过滤,替换或输出需要的字符串。

Linux正则表达式一般以行为单位处理。

正则表达式应用非常广泛,存在于各种语言中:php perl Python 等。

现在学的是Linux中的正则表达式,最常应用正则表达式的命令是linux三剑客:grep(egrep),sed,awk。

Linux系统开发: 学习linux三剑客(awk、sed、grep)(上)

Linux系统开发: 学习linux三剑客(awk、sed、grep)(下)

正则表达式是一个模版,这个模版是由一些普通字符和一些元字符组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义。

在少数情况下,正则表达式可能失效,多数与字符集有关。

1.2 区分通配符与正则表达式

这里一定要弄清楚正则表达式和linux下使用的通配符有本质区别。

正则表达式用来找:【文件】内容,文本,字符串。一般只有三剑客支持。

示例:

代码语言:javascript复制
#grep 123* demo.c 123* 则表明匹配12或1234/1235等字符串,但是不能匹配123

通配符用来找:文件目录名,普通命令都支持。

示例:

代码语言:javascript复制
#grep 123* demo.c 123* 则表明匹配12或1234/1235等字符串,但是不能匹配123

在三剑客awk,sed,grep,egrep都是正则表达式,其他都是通配符

1.3 正则表达式的分类

基本的正则表达式(Basic Regular Expression 又叫Basic RegEx 简称BREs)

扩展的正则表达式(Extended Regular Expression 又叫Extended RegEx 简称EREs)

Perl的正则表达式(Perl Regular Expression 又叫Perl RegEx 简称PREs)

1.3.1 基本的正则表达式

BREs

EREs

PREs

描述

实例

转义符,将特殊字符进行转义,忽略其特殊意义

a.b就表示匹配a.b,而a.b则表示匹配除换行符之外的任意单个字符,例:aab,abb

^

^

^

匹配行首,awk中,^则是匹配字符串的开始

^name匹配以name开头的行

$

$

$

匹配行尾,awk中,$则是匹配字符串的结尾 注意:^$表示匹配空白行

sh$匹配以sh结尾的行

.

.

.

匹配除换行符n之外的任意单个字符,awk则中可以

a.b则表示匹配除换行符之外的任意单个字符,例:aab,abb

[]

[]

[]

匹配包含在字符之中的任意一个字符,可用a-z,0-9,.,/

aab匹配aa或ab

^

^

^

匹配^字符之外的任意一个字符

^12表示不匹配12但可以匹配123,124

-

-

-

匹配[]中指定范围内的任意一个字符,要写成递增

0-9匹配0-9的任意一个数字

不支持

?

?

匹配之前的项1次或者0次(省略?前一个字符) 如果匹配0次,则默认为空,也就等于全匹配了。

127?3可匹配1273,可匹配123,不可匹配12743

不支持

匹配之前的项1次或者多次

11 可匹配11,也可匹配116,1167等

*

*

*

匹配之前的项0次或者多次。匹配0个时,实际上为空,那么默认匹配全文件内容,因此所有文件内容都会显示出来,然后再匹配大于0个的情况。 .*则表示匹配任意字符 ^.*匹配任意字符开头的行 .*$匹配任意字符结尾的行

1237*可匹配123,12378,不可匹配1237 *2可匹配里面所有有2的内容

不支持

()

()

匹配表达式,创建一个用于匹配的子串,注意()有时可需用到转义字符。

he(ll)匹配包含hell的字符串

不支持

{n}

{n}

匹配之前的项n次,n是可以为0的正整数

0-5{5}可匹配每位为0-5之间的五位数

不支持

{n,}

{n,}

之前的项至少需要匹配n次,注意,有时需用到转义字符,如果使用扩展正则表达式选项参数,可不用转义字符。

0-5{3,}可匹配每位为0-5之间的至少三位数

不支持

{n,m}

{n,m}

指定之前的项至少匹配n次,最多匹配m次,n<=m

0-5{3,5},可匹配每位为0-5之间的至少三到五位数。(此表达式实测有出入)

不支持

|

|

交替匹配|两边的任意一项,有时需用到转义字符

ab(c|d),可匹配abc或abd

只有在用反斜杠进行转义的情况下,字符(),{}才会在BRE被当作元字符处理,而ERE中,任何元符号前面加上反斜杠反而会使其被当作普通字符来处理。所以ERE中直接使用(),{},而BRE则() ,{}

grep中调用-E参数指定使用扩展正则表达式。

sed中调用-r参数指定使用扩展正则表达式。

或者直接使用egrep。

1.3.2 POSIX字符类

POSIX字符类是一个形如:...:的特殊元序列(meta sequence),他可以用于匹配特定的字符范围。

注意运用时还得在外层加一对[]号。

BREs

EREs

PREs

描述

实例

:alnum:

:alnum:

:alnum:

匹配任意一个字母或数字字符

[:alnum:]匹配所有带任意一个数字或字母的行

:alpha:

:alpha:

:alpha:

匹配任意一个字母字符

[:alpha:]匹配所有带任意一个字母的行

:blank:

:blank:

:blank:

匹配空格或制表符(t、v)

[:blank:]匹配所有带空格或制表符的行

:digit:

:digit:

:digit:

匹配任意一个数字字符

[:digit:]匹配所有带任意一个数字字符的行

:xdigit:

:xdigit:

:xdigit:

匹配一个十六进制数(即:0-9,a-f,A-F)

[:xdigit:]匹配所有带任意一个十六制数字符的行

:lower:

:lower:

:lower:

匹配小写字母

[:lower:]匹配所有带小写字母的行

:upper:

:upper:

:upper:

匹配大写字母

[:upper:]{2}匹配连续出现两个大写字母的行

:punct:

:punct:

:punct:

匹配标点符号

[:punct:]匹配所有带标点符号的行

:space:

:space:

:space:

匹配一个包括换行符(r)、回车在内的所有空白符

[:space:]匹配所有带换行符或回车的的行

:graph:

:graph:

:graph:

匹配任意一个可以看得见并可以打印的字符

[:graph:]匹配所有带任意一个可以看得见并可以打印的字符的的行

:cntrl:

:cntrl:

:cntrl:

匹配任意一个控制字符(ASCII前32个字符)

[:cntrl:]匹配所有带任意一个控制字符的行

:print:

:print:

:print:

匹配任意一个可以打印的字符

[:print:]匹配所有带任意一个可以打印的字符的的行

1.3.3 Perl的正则表达式: 元字符

元字符(meta character)是一种Perl风格的正则表达式,只有一部分文本处理工具支持它,并不是所有的文本处理工具都支持。

BREs

EREs

PREs

描述

b

b

b

单词边界

B

B

B

非单词边界

w

w

w

单个单词字符(字母、数字、_)

W

W

W

单个非单词字符

不支持

不支持

d

单个数字字符

不支持

不支持

D

单个非数字字符

不支持

不支持

s

单个空白字符

不支持

不支持

S

单个非空白字符

不支持

不支持

r

回车

不支持

不支持

n

换行符

不支持

不支持

t

横向制表符

不支持

不支持

v

垂直制表符

不支持

不支持

f

换页符

0 人点赞