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

180 阅读6分钟

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下使用的通配符有本质区别。

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

示例:

#grep 123* demo.c123* 则表明匹配12或1234/1235等字符串,但是不能匹配123

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

示例:

#ls  *表明递归列出当前目录下的所有不以.号开头的文件信息

在三剑客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 基本的正则表达式

BREsEREsPREs描述实例
\\\转义符,将特殊字符进行转义,忽略其特殊意义a\.b就表示匹配a.b,而a.b则表示匹配除换行符之外的任意单个字符,例:aab,abb
匹配行首,awk中,^则是匹配字符串的开始^name匹配以name开头的行
$$$匹配行尾,awk中,$则是匹配字符串的结尾注意:^$表示匹配空白行sh$匹配以sh结尾的行
...匹配除换行符\n之外的任意单个字符,awk则中可以a.b则表示匹配除换行符之外的任意单个字符,例:aab,abb
[][][]匹配包含在[字符]之中的任意一个字符,可用[a-z],[0-9],[\.,/]a[ab]匹配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),他可以用于匹配特定的字符范围。

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

BREsEREsPREs描述实例
[: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风格的正则表达式,只有一部分文本处理工具支持它,并不是所有的文本处理工具都支持。 

BREsEREsPREs描述
\b\b\b单词边界
\B\B\B非单词边界
\w\w\w单个单词字符(字母、数字、_)
\W\W\W单个非单词字符
不支持不支持\d单个数字字符
不支持不支持\D单个非数字字符
不支持不支持\s单个空白字符
不支持不支持\S单个非空白字符
不支持不支持\r回车
不支持不支持\n换行符
不支持不支持\t横向制表符
不支持不支持\v垂直制表符
不支持不支持\f换页符