第3章 查找与替换——(POSIX)BRE正则表达式

1.grep的用法:
-E 使用扩展正则表达式进行匹配。
-F 使用固定字符串进行匹配,可省略
-e 字符串以减号开头时grep会混淆。-e可以指定其参数为模式(字符串)
-f pat-file 从pat-file文件读取模式作匹配
-i 模式匹配时忽略字母大小写差异
-l 列出匹配模式的文件名称,而不是对应的行
-q 静默的。grep成功则离开,而不是写入stdin。
-s 不显示错误信息。通常与-q并用。
-v 取反,显示不匹配的行
2.(POSIX)正则表达式
(1)特殊字符常称为元字符(meta字符)
(2)POSIX BRE与ERE的meta字符



(3)方括号表达式:
1》字符集 [::]括起来,如英文字符[[:alpha:]]
2》排序符号 [..]括起来 如[[.ch.]],匹配ch,而不匹配单个c或h
3》等价字符集 [==]括起来 如[[=e=]],在法文locale里,可能匹配于e、é、è等
注意:以上三种构造必须在方括号表达式中

3.基本正则表达式(BRE)
(1)匹配单个字符
1》如何让meta字符表示他们自己?
答:前面加上反斜杠\转义:如\*匹配*,\\匹配\
2》. 匹配“任一字符”。
3》用方括号表达式可以匹配单个字符
注意一:在方括号表达式里,^放在字首表示取反,也就是匹配不在方括号列表里的任意字符。如[^aeiou]匹配除小写元音以外的字符。
注意二:方括号表达式允许“范围”,如[0-9]表示0123456789、[0-9a-z]等
这里有个问题:这样做可能降低移植性,因为这里的范围与locale相关(locale排序序列里的位置,你系统上的[0-a]和他系统上的[0-a]可能包括不一样的字符)
4》方括号表达式的注意点:
<1>在方括号表达式中,其他的meta字符都会失去特殊含义。
<2>如何让]进入该集合?
答:将]放到列表的最前面
如何让-进入该集合?
答:将-放到列表的最前面
如何让]和-都进入该集合?
答:将]放到第一个字符,将-放到最后一个字符
(2)后向引用
第一步:将子表达式包围在\(与\)里。可嵌套。
第二步:在同一模式之后使用\digit。digit范围1——9。、
意义:指的是“匹配于第n个先前方括号内子表达式匹配成功的字符”
如何确定子表达式的编号,以左括号为准,从左至右依次为1——9
例:\(['"]\).*\1 匹配以单引号或双引号括起来的字。当前面匹配成功的是’时,后面必须出现’才算匹配。前面是”时,同。
(3)*和\{ \}
*:表示前面的正则表达式重复出现任意次(包括0次)
如ab*c匹配:ac abc abbc 但是不匹配aQc
注意:在BRE中,*在最前面表示其本身,失去特殊意义
\{和\}:
1》\{n\} 前置正则表达式所得结果出现n次
2》\{n,\} 前置正则表达式所得结果至少出现n次
3》\{n,m\} 前置正则表达式所得结果出现次数>=n次,<=m次
n与m的值必须介于0至RE_DUP_MAX(含)之间。
RE_DUP_MAX:POSIX定义的符号常量,可用getconf取得。
注意:以上两个meta符只能作用于单个字符正则表达式
(4)文本匹配描点
^和$称为描点
^ 表示其后的正则表达式出现在行开头
$ 表示其后的正则表达式出现在行结束
如^$表示空行
注意:^和$只有在BRE的起始和结尾处才有特殊用途。
(5)BRE运算符优先级: