Linux正则表达式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux正则表达式相关的知识,希望对你有一定的参考价值。

什么是正则表达式 (BREs-基本正则表达式  EREs-扩展正则表达式)

   (简单说:处理大量字符串而定义的一套规则和方法,linux正则一般以行为单位处理)

   1、正则表达式就是为了处理大量的字符串而定义的一套规则和方法

   2、通过定义的这些特殊符号的辅助,系统管理员就可以快速过滤,替换和输出需要的字符串,Linux正则表达式一般以行为单位处理

   3、正则表达式由两种字符构成: 特殊字符(元字符)、普通文本字符(文字)


   # 经常使用正则表达式的shell命令和工具:Linux三剑客(grep、sed、awk)

   # grep、vi、sed都属于BRE(基本正则表达式)这一派,并保证兼容EBR,可以使用\\进行转义特殊符号

   # egrep、awk则属于ERE(扩展正则表达式)这一派


    **grep正则特点(按行处理),默认BREs,可以使用grep -E或egrep开启扩展正则表达式(EREs)

    **sed 正则特点(按行处理),默认BREs,可以使用sed -r开启扩展正则表达式(EREs)

    **awk(gawk)正则特点(对列进行操作),默认扩展正则表达式(EREs)


基本正则表达式 (BRE  Basic Regular Expression)



.     表示匹配任意一个字符       (例如: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)

?   表示匹配前边的字符最多出现一次,既0次或1次        (例如:egrep go?dgrep go\\?d      --> 匹配gd、god等字符串          )
+ 表示匹配前边的字符出现1次或多次,即大于等于1次 (例如:egrep go+dgrep go\\+d --> 匹配god、good、goood等字符串 )
() 表示匹配整个括号内的字符串,原来都是匹配单个字符 (例如:egrep g(oo|la)grep g\\(oo\\|la\\) --> 匹配good、glad )
表示匹配前面的字符出现的次数 (例如:egrep cd1,2grep cd\\1,2\\ --> 匹配cd、cdd )
| 表示"或"匹配一组可选字符 (例如:egrep god|goodgrep god\\|good --> 匹配god、good )


元字符区别

    BRE 4组元字符 []  、 .  、 ^ 、$

    ERE 7组元字符 []  、 .  、 ^ 、$、 、 () 、|


posix字符类(BRE、ERE、PRE)

#注意:使用时必须使用双括号[[:alnum:]]

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

 # 注意: posix的正则规范可以帮助我们解决语系问题,例如:匹配中文等

# 特殊符号  代表意义
[: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"等价的所有字符


以上是关于Linux正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式:数字开头中间字母结尾数字

如何过滤文本文件中以大写字母开头并以正整数结尾的行,并在 linux 的命令行上使用正则表达式?

linux正则表达式

Linux 正则表达

Linux 正则表达

Linux正则表达式