Linux系统开发: linux下正则表达式
Posted DS小龙哥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux系统开发: linux下正则表达式相关的知识,希望对你有一定的参考价值。
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.c 123* 则表明匹配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 基本的正则表达式
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],[\\.,/] | 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),他可以用于匹配特定的字符范围。
注意运用时还得在外层加一对[]号。
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 | 换页符 |
以上是关于Linux系统开发: linux下正则表达式的主要内容,如果未能解决你的问题,请参考以下文章