注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Computer Science

I Pressed My Words Here. Will You Read ?

 
 
 

日志

 
 

《Shell脚本学习指南》读书笔记3  

2012-02-02 18:01:37|  分类: 读书笔记 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
书名:Shell脚本学习指南
豆瓣评分:7.3分(426人评价)
博主评价:
未评价很差较差还行推荐力荐
来自豆瓣读书资源
BRE(Basic Regular Expression)
ERE(ExtendedRegularExpression)

BRE/ERE:
\       通常用以关闭后续字符的特殊意义。有时则是相反的打开后续字符的特殊意义,例如:\(...\)与\{...\}
.       匹配任何单个的字符,用NUL除外。独立程序也可以不允许皮排换行字符。
*       匹配在它之前的任何书目(或没有)的单个字符。以ERE而言,此前置字符可以是正则表达式,例如:因为.(点号)表示任一字符,所以.*代表“匹配任一字符的任意长度”>
。以BRE来说,*若置于正则表达式的第一个字符,不具任何特殊意义。
^       匹配紧接着的正则表达式,在行或字符串的起始处。BRE:仅在正则表达式的开头处具此特殊含义,ERE:置于任何位置都具特殊含义。
$       匹配前面的正则表达式,在字符串或行结尾处。BRE:仅在正则表达式结尾处具特殊含义。ERE:置于任何位置都具特殊含义。
[…]     方括号表达式(bracket expression),匹配方括号内的任一字符。连字符(-)指的是连续字符的范围(注意:范围会因locale而有所不同,因此不具可移植性)。

BRE:
\{n,m\} 区间表达式(interval expression),匹配在它前面的单个字符重现(occurrences)的次数区间。\{n\}指的是重现n次;\{n,\}则为至少重现 (occurrences)n次,而\{n,m\}为重现n至m次。n与m的值必须介于0至RE_DUP_MAX(含)之间,后者最小值为255。
\( \)   将\(与\)间的模式存储在特殊的“保留空间(holding space)“。最多可以将9个独立的子模式(subpattern)存储在单个模式中。匹配于子模式的文本,可通过转义序列(escape sequences) \1至\9,被重复使用在相同模式里。例如\(ab\).*\1,指的是匹配于ab组合的两次重现,中间可存在任何数目的字符。
\n      重复在\(与\)方括号内第n个子模式至此点的模式。n为1至9的数字,1为由左开始。

ERE:
{n,m}   与先前提及BRE的\{n,m\}一样,只不过方括号前没有反斜杠。
+       匹配前面正则表达式的一个或多个实例。
?       匹配前面正则表达式的零个或一个实例。
|       匹配于|符号前或后的正则表达式。
()      匹配于方括号括起来的正则表达式群。



正则表达式中\{n,m\} 前置正则表达式所得的结果重现n至m次
而n和m的取值范围为0到RE_DUP_MAX之间。
will@computerscience.blog.163.com$ getconf RE_DUP_MAX
32767
得到当前系统中RE_DUP_MAX为32767。RE_DUP_MAX在不同系统中取值不同,最小为255。

UNIX中的字符集(character class)在POSIX的标准下称作:方括号表达式(bracket expression)。其除字面意义字符(如[0-9])外,另有:
字符集(Character class)
以[:与:]将关键字组合括起来的POSIX字符集。关键字描述各种不同的字符集,例如英文字母字符、控制字符等。
排序符号(Collating symbol)
排序符号指的是将多字符序列视为一个单位。它使用[.与.]将字符组合括起来。
排序符号在系统所使用的特定locate上各有其定义。
等价字符集(Equivalence class)
等价字符集列出的是应视为等值的一组字符,例如e与è。它由取自于locale的名字元素组成,以[=与=]括住。
注意:[:alpha:]匹配字符a、l、p、h以及:。如果要用字符集匹配须写成[[:alpha:]]。

POSIX字符集
 [:alnum:]   数字字符
 [:lower:]   小写字母字符
 [:alpha:]    字母字符
 [:print:]     可显示的字符
 [:blank:]    空格(space)与定位(tab)字符
 [:punct:]    标点符号字符
 [:cntrl:]      控制字符
 [:space:]   空白(whitespace)字符
 [:digit:]      数字字符
 [:upper:]    大写字母字符
 [:graph:]   非空格(nonspace)字符
 [:xdigit:]     十六进制数字
Tips: 在方括号表达式中,所有其他的meta字符都会失去其特殊含义。所以[*\.]匹配于字面上的型号、反斜杠以及句点。要让]进入该集合,可以将它房子列表 的最前面[]*\.],将]增加到此列表中。要让建好字符进入该集合,也请将它放到列表最前端:[-*\.]。
若,你需要右方括号与减号两者进入列表,请将右方括号放到第一个字符、减号放到最后一个字符:[]*\.-]。

grep 加上 -v 选项可以用来显示所有不匹配于模式的行。
^$ 仅在BRE的起始与结尾处具有特殊用途。
[^]无效的原因,联系[^abc]的含义便知道,它用作“非”含义的表达。


BRE运算符优先级,由高至低
 [..] [==] [::]
 用于字符排序的方括号符号
 \metacharacter 转义的meta字符
 [] 方括号表达式
 \( \) \digit
 子表达式与后向引用
 *  \{ \}
 前置单个字符重现的正则表达式
 无符号(no symbol)
 连续
 ^ $
 锚点
 


扩展正则表达式:
ERE与BRE在大多数meta字符与功能应用上几乎是完全一致,但ERE里有些meta字符看起来与BRE类似,却具有完全不同的意义
  • 在awk里:其\符号在方括号表达式内表示其他的含义。因此如需匹配左方括号、连字符、右方括号或是反斜杠,你应该用[\[\-\]\\]。
  • 圆括号在ERE里具有特殊含义,但和BRE里的使用又有所不同。ERE里,\(与\)匹配的是字面上的左括号与右括号,\{与\}匹配字面上的左花括号与右花括号。ERE里重现5个a应写为:a{5}。
  • ERE中提供两个用于细腻处理匹配控制的meta字符:
    • ?    匹配于0个或一个前置正则表达式
    • +    匹配于1个或多个前置正在表达式
  • 交替 (alternation) 或称为管道字符(|)。被用于匹配其前后相邻的字符序列。| 字符为ERE运算符里优先级最低的。
  • 分组: 圆方括号提供分组功能。
    • 交替和分组的配合 can be powerful: 如^(abcd|abcd)$ 又如 (^abcd|efgh)$
  • ^与$在ERE中和BRE的含义相同,不同的是它无论放在何处都是meta字符。


ERE运算符的优先级,由高至低

 [.  .] [= =] [: :]
用于字符对应的方括号符号
 \metacharacter 转义的meta字符
[ ]
方括号表达式
( )
分组
* + ? { }
重复前置的正则表达式
无符号(no symbol)
连续字符
^ $
锚点 (Anchors)
|
交替 (Alternation)
  


正则表达式的扩展:
单词的匹配:\<与\>之间的字符序列被用于匹配单词。通常,单词的开头要么出现杂行起始处,要么出现在第一个后面紧跟一个非单词组成(nonword-constituent)字符的单词组成(word-constituent)字符。单词的结尾也同理。
额外的GNU正则表达式运算符
 \w匹配任何单词组成字符,等同于[[:alnum:]_]
 \W匹配任何非单词组成字符,等同于[^[:alnum:]_]
 \< \>匹配单词的起始与结尾,如前文所述。
 \b匹配单词的起始或结尾处所照到的空字符串。这是\<与\>运算符的结合。
注意:由于awk使用\b表示后退字符,因此GNU awk (gawk)使用\y表示此功能。
 \B匹配两个单词组成字符之间的空字符串。
 \' \`
分别匹配emacs缓冲区的开始与结尾。GNU程序(还有emacs)通常将它们视为与^及$同义。
POSIX明白表示NUL字符无须是可匹配的,但GNU程序则无此限制。可通过.meta字符或方括号表达式来匹配。


程序与正则表达式:
  grep seded
ex/vi
more
 egrepawk
lex
 BRE   
 ERE      ● ●
 \< \>
 ● ● ● ● ●   
  
POSIX的grepGlobal search Regular Expression(RE) and Print out the line (or I thougth: Globally execute Regular Expression with Print))默认行为模式使用的是BRE。真正地遵循POSIX的程序应采用grep -E。而grep -F表示使用fgrep的固定字符串匹配算法。
为了让程序具有可移植性,若需要在awk程序里匹配大方括号,应该以反斜杠转义它,或将它们括在方括号表达式里。


文本文件惯例:
由于UNIX鼓励使用文本型数据,因此系统上最常见的数据存储类型就是文本了,在文本文件下,一行表示一条记录。这里要介绍的是在一行内用来分隔字段的两种惯例。
首先是直接使用空白(whitespacce),也就是空格键(space)或制表(tab)键。
第二种惯例是使用特定的定界符来分隔字段,例如冒号。

使用时,要尽量保证定界符不会出现在数据内容里。以免解析错误。

这两种方式最明显的不同,便是在处理多个连续重复的定界符之时。使用空白(whitespace)分隔时,通常多个连续出现的空格或制表字符都将看作一个定界符。然而,若使用的是特殊字符分隔,则每个定界符都隔开一个字段。



更多相关命令:
sedcut、 join...
computerScience推荐阅读:
  评论这张
 
阅读(81)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017