什么是正则表达式

描述

(BREs-基本正则表达式  EREs-扩展正则表达式)
1、正则表达式就是为了处理大量的字符串而定义的一套规则和方法
2、通过定义的这些特殊符号的辅助,系统管理员就可以快速过滤,替换和输出需要的字符串,Linux正则表达式一般以行为单位处理
3、正则表达式由两种字符构成: 特殊字符(元字符)、普通文本字符(文字)

简单描述:处理大量字符串而定义的一套规则和方法
注意需求:linux正则一般以行为单位处理

常用正则表达式的shell命令

Linux三剑客

命令

描述

grep

文本过滤

sed

流编辑器

awk

报告生成器、文本分析工具

1、grep、vi、sed属于BRE(基本正则表达式),并保证兼容EBR,可以使用\进行转义特殊符号
2、egrep、awk属于ERE(扩展正则表达式)


补充点:

grep正则特点(按行处理),默认BREs,可以使用grep -E或egrep开启扩展正则表达式(EREs)
sed 正则特点(按行处理),默认BREs,可以使用sed -r开启扩展正则表达式(EREs)
awk(gawk)正则特点(对列进行操作),默认扩展正则表达式(EREs)


基本正则表达式

英文:BRE  Basic Regular Expression 简写:BRES

字符

描述

举例

.

匹配任意一个字符

例如:cd.y     -->  匹配cdly、cdqy

*

重复前一个字符0次或多次

例如:go*gle -->  匹配gogle、google、gooogle等

.*

匹配任意长度的任意字符

例如:g.*gle -->  匹配gle、gogle、google、gooogle等

^

锚定行首,匹配开头

例如:^#     -->  搜寻以#开头的行

$

锚定行尾,匹配结尾

例如:#$     -->  搜寻以#结束的行

^$

匹配空行


[]

匹配指定范围内的任意单个字符

例如:g[lf]    -->  匹配gl、gf

[^]

匹配指定范围外的任意单个字符

例如:[^a-c] -->  匹配非a、b、c字符以为的行

\

转义符,屏蔽一个字符的特殊意义

例如:\*        -->  匹配*

转义符(扩展)

\?         表示匹配前边的字符最多出现一次,既0次或1次  
\+ 表示匹配前边的字符出现1次或多次,即大于等于1次
\(\) 表示分组,其后可用\num对分组的内容做引用,num表示数字
A\|B 表示匹配A或者B,称为多选分支 (例如:c\|d --> 匹配ch、do等 )
\{n\} 表示匹配前面的字符出现n次 (例如:cd\{2\}ly --> 匹配cddly )
\{n,\} 表示匹配前面的字符最少出现n次 (例如:cd\{2,\}ly --> 匹配cdly、cddly等)
\{,m\} 表示匹配前面的字符最多出现m次 (该方法有的版本不支持,可以使用\{0,m\} )
\{n,m\} 表示匹配前面的字符最少出现n次,最多出现m次 (例如: cd\{1,3\}ly --> 匹配cdly、cddly、cdddly)
\< 表示单词词首锚定,匹配单词开头 (例如:\<cd --> 匹配单词cdly)
\> 表示单词词尾锚定,匹配单词结尾 (例如:ly\> --> 匹配单词cdly)
\<\> 表示匹配单词的起始位置和结束位置,等价于匹配一个单词
\b 匹配单词边界,开始或结尾的位置(在awk中使用\b表示后退字符,awk的\y表示此功能)
\B 匹配非单词边界 (例如:cool\B --> 匹配coolant,不匹配cool)
\d 匹配0-9中的任意一个数字,等同于[0-9] (此正则只支持在perl语法中使用,或者使用grep -P引用,简称PCRE)
\D 匹配非数字,等同于[^0-9] (此正则只支持在perl语法中使用,或者使用grep -P引用,简称PCRE)
\f 匹配一个换页符,等价于\x0c或\cL
\n 匹配一个换行符,等价于\x0a或\cJ
\r 匹配一个回车符,等价于\x0d或\cM
\s 匹配任何空白字符,包括空格、制表符、换页符等等,等价于[\f\n\r\t\v]
\S 匹配任何非空白字符,等价于[^\f\n\r\t\v]
\t 匹配一个横向制表符,等价于\x09或\cI (字符内出现t导致匹配失败的时候,请使用$'\t')
\v 匹配一个垂直制表符,等价于\x0b或\cK
\w 匹配任何一个由字母(大小写)数字下划线及汉字组成的字符,等同于[[:alnum:]_汉字]或[a-zA-Z0-9_汉字](注意:汉字前后必须有其他符合字符)
\W 匹配任何一个非字母(大小写)数字下划线的字符,等价于[^[:alnum:]_]或[^a-zA-Z0-9_]
\\ 匹配转义字符本身\
\cX 匹配由X指明的控制字符,例如: \cM匹配一个Control-M或回车符,X的值必须为A-Z或a-z之一,否则将c视为一个原义的'c'字符
\dXX 匹配 十 进制ASCII值为XX的字符
\oXX 匹配 八 进制ASCII值为XX的字符
\xXX 匹配十六进制ASCII值为XX的字符
\xn 匹配n,其中n为十六进制转义值;数值本身可以是两位或三位数字,例如:'\x41'匹配字符A,正则中可使用ASCII编码
\0n 匹配n,其中n为八进制转义值;数值本身可以是两位或三位数字,例如:'\011'匹配字符9,等价于\t,正则中可使用ASCII编码
\num 其中num是一个正整数,范围:1~9,表示对所获取的匹配的引用(后向引用)
\' 匹配"模式空间"中的开头(^),此正则只支持在sed语法中使用(多行模式下和"^"是不同的)
\` 匹配"模式空间"中的结尾($),此正则只支持在sed语法中使用(多行模式下和"$"是不同的)

特殊字符

^[A-Za-z0-9\u4E00-\u9FA5-]{2,16}$   只允许数字、26个英文字母大小写、中文及其组合
[\u4e00-\u9fa5] 匹配任意一个汉字


扩展正则表达式

英文:ERE  Extend Regular Expression  简写:EREs

字符

描述

举例

?

匹配前边的字符出现0次或1次

例如:egrep 'go?d'  、grep 'go\?d'      匹配gd、god等

+

匹配前边的字符出现1次或多次

例如:egrep 'go+d'  、 grep 'go\+d'    匹配god、good、goood等

()

匹配整个括号内的字符串

例如:egrep 'g(oo|la)'  、grep 'g\(oo\|la\)'  匹配good、glad

{}

匹配前面的字符出现的次数

例如:egrep 'cd{1,2}' 、 grep 'cd\{1,2\}'      匹配cd、cdd

|

"或"匹配一组可选字符

例如:egrep 'god|good'  、 grep 'god\|good'  匹配god、good


元字符区别

BRE 4组元字符 []  、 .  、 ^ 、$
ERE 7组元字符 [] 、 . 、 ^ 、$、{} 、 () 、|


posix字符类(BRE、ERE、PRE)


注意:
1、使用时必须使用双括号[[:alnum:]]
2、posix的正则规范可以帮助我们解决语系问题,例如:匹配中文等

描述:(Portable Operating System Interface)可移植操作系统接口ERE是BRE的扩展版本,具体更强的处理能力,并增加了一些元字符(metacharactor)

特殊符号

描述

[:alnum:]

代表英文字母大小写及数字,比如:[a-zA-Z0-9]

[:alpha:]

代表任何英文大小写,比如:[a-zA-Z]

[:lower:]

代表小写字母,比如:[a-z]

[:upper:]

代表大写英文字母,比如:[A-Z]

[:digit:]

代表数字,比如:[0-9]

[:blank:]

代表空白按键或[Tab] 按键

[:cntrl:]

代表键盘上面的控制按键,比如:CR、LF、Tab、Del.. 等等

[:graph:]

除了(空白按键 [Tab] 按键) 外的其他所有按键(和[:print:]一样,但不包含空格)

[:print:]

代表任何可以被打印的字符(和[:graph:]类似,包含空格)

[:punct:]

代表特殊符号,比如:分号\" 单引号\' ? ! ; : # $...(不属于:[:alnum:] [:cntrl:]的任何一个字符)

[:space:]

任何空白键(包括:空白键、[Tab]、CR等等

[:xdigit:]

代表 16 进制的数字类型,因此包括: 0-9、A-F、a-f 的数字与字符

[:word:]

匹配单词里面的字符(大小写字母)

[:ascii:]

匹配所有的"ASCII"字符

[=c=]

代表与字符"c"等价的所有字符