shell学习第八天----扩展正则表达式(ERE)

扩展正则表达式(ERE)

拥有笔记本正则表达式更多的功能.BREERE在大多数的meta字符与功能应用上几乎是完全一致,ERE理由写meta字符看起来与BRE类似,却具有完全不同的类型.

 

扩展正则表达式与基础正则表达式的唯一区别在于:? + () {} 这几个字符。

基础正则表达式中,如果你想? + () {}表示特殊含义,你需要将他们转义

而扩展正则表达式中,如果你想? + () {} 不表示特殊含义,你需要将他们转义。

转义符号,都是一样的,\符号。

所谓特殊含义,就是正则表达式中的含义。非特殊含义,就是这个符号本身。

例如 

[[email protected] ~#] echo aaa|grep 'a?';[[email protected] ~#] echo aaa|grep 'a\?';aaa#egrep使用的是扩展正则表达式[[email protected] ~#] echo aaa|egrep 'a?';aaa[[email protected] ~#] echo aaa|egrep 'a\?';

 

可见,扩展正则表达式与基础正则表达式的区别,就是它们加不加转义符号,代表的意思刚好相反。

 

ERE历史没有后向引用的.圆括号在ERE里具有特殊含义,但和BRE里使用的又有所不同.ERE, \ ( 与 \ )匹配的是字面上的左括号与右括号

 

匹配单个表达式与多个正则表达式

ERE在匹配多字符这方面,BRE有明显的不同,不过在(*)的处理上和BRE是相同的.

 

注意:有一个例外,*作为ERE的第一个字符是”未定义的”,而在BRE中它是指”符合字面的”.

一般情况下使用grep控制BRE,使用egrep控制ERE.

使用ERE匹配我们之前介绍过的离子”要刚好重现5a”以及”重现10个至42q”,写法分别为:a{5},q{10,42}.\{\}则可以匹配字面上的花括号.当在ERE{找不到匹配},POSIX特意保留其含义为”未定义状态”.

 

ERE另有两个meta字符,可更细腻的处理匹配控制:

? 匹配于0个或一个前置正则表达式

+ 匹配于一个或多个前置正则表达式

可以把?想象成是”可选用的”,也就是说,匹配前置正则表达式的文本,要么出现,要么没出现.例如:ab?c匹配的有acabc,就这两者 ! (ab*c相较之下,后者匹配于中间有人一个b).

 

+字符在概念上与* meta字符类似,不过前置正则表达式要匹配的文本在这里至少得出现一次.例如ab+c匹配于abc,abbc,abbbc,但是不匹配于ac.

ab+c的正则表达式等价于abbc;无论如何,当前值正则表达式很复杂时,使用+可以少打一点字,这就减少了打错字的几率.

 

 

交替

方括号运算符一宇表示”匹配于次祖父,或其他字符,...”,但不能指定”匹配于这个序列,或其他序列”.要达到后者的目的,可以使用管道运算符 ( | ).例如 read | write匹配于readwrite两者,fast|slow匹配于 fast与 slow.

字符是ERE运算符;i优先级最低的.

你可能感兴趣的:(shell脚本编程)