《Sed 和 Awk》(第二版)学习系列之第三章

来源:互联网 发布:淘宝助理无法上传宝贝 编辑:程序博客网 时间:2024/05/17 09:45

第三章 正则表达式语法
1. 元字符汇总:
通配符:
。---------------------匹配除换行符以外的任何单个字符,在awk中也能匹配换行符
*-----------------------匹配任意一个(包括零个)在它前面的字符(串)
[…]---------------------匹配方括号中的字符类中的任意一个,若方括号中第一个字符为脱字符号(^),则表示否定匹配,即匹配除了换行符和括号中列出的所有字符以外的字符,在awk中也匹配换行符;连字符(-)表示字符的范围;若类中的第一个字符为右方括号(]),则表示它是类的成员,所有其他的元字符在被指定为类中的成员时都将失去它原来的含义。
^----------------------若作为正则表达式的第一个字符,则表示匹配行的开始,在awk中匹配字符串的开始,即使字符串包含嵌入的换行符。
$----------------------若作为正则表达式的最后一个字符,则表示匹配行的结尾,在awk中匹配字符串的结尾,即使字符串包含嵌入的换行符。
\{n,m\}--------------匹配它前面某个范围内单个字符出现的次数,\{n\}将匹配n次出现,\{n,\}将至少匹配n次出现,而且\{n,m\}将匹配n和m之间(闭区间)的任意次出现。
【注意】这个元字符在某些老版本上不能使用!
\-----------------------用来屏蔽一个元字符的特殊含义。
扩展的元字符:(egrep, awk)
+----------------------匹配前面的正则表达式的一次或多次出现
?----------------------匹配前面的正则表达式的零次或一次出现
|-----------------------指定可以匹配其前面的或后面的正则表达式
()---------------------对正则表达式进行分组
{n,m}---------------匹配它前面某个范围内单个字符出现的次数。{n}表示匹配n次出现,{n,}至少匹配n次出现,{n,m}匹配n和m之间的任意次出现。

(1)对通配符*的理解:
“*”表示匹配任意一个(或者零个)在它前面的字符(串),换句话说,一个单字符后紧跟*,则匹配0个或者多个此字符
books*---------------------可以用来匹配book, books
(2) 两个通配符结合使用的情况:
book.*------------------------用来匹配book后有任意个字符或没有字符
(3) 定位元字符(^$)
^$------------------可以用来匹配空行
(4) 短语的匹配:通过编写一系列正则表达式来捕获一个短语

(5) 对字符跨度元字符的理解:注意这个元字符均设置了查找字符的范围,比通用元字符更加具体。
10\{2,4\}1-------------匹配1001,10001,100001
grep '[0-9]\{3\}-[0-9]\{8\}' telephone-----------------------匹配查找电话号码
(6) 注意元字符在匹配字符个数上的差异。
(7) 扩展元字符只能在egrep和awk中使用,sed中没有此类元字符!
(8) 选择性操作:|
Unix|Linux
(9) 分组操作:() 用于对正则表达式进行分组并设置优先级
BigOne( Computer)? -----------------------可以匹配BigOne或者BigOne Computer

【举例分析】

 

利用列举单词前后可能出现的字符集来匹配原文本文件含book相关信息的行

(^|  )………….(  |$)是用来弥补book出现在行头或者行尾这两种特殊情况。

(10) 正则表达式总是尝试匹配最长的字符串,为了解决这个限制,可以尝试用 \{n,m\}等相关元字符进行范围限制!

(11) 一些有用的正则表达式: