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 | 换页符 |