《LINUX与UNIX SHELL编程指南007.pdf》由会员分享,可在线阅读,更多相关《LINUX与UNIX SHELL编程指南007.pdf(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、下载第7章 正则表达式介绍随着对U N I X和L I N U X熟悉程度的不断加深,需要经常接触到正则表达式这个领域。使用s h e l l时,从一个文件中抽取多于一个字符串将会很麻烦。例如,在一个文本中抽取一个词,它的头两个字符是大写的,后面紧跟四个数字。如果不使用某种正则表达式,在s h e l l中将不能实现这个操作。本章内容包括:匹配行首与行尾。匹配数据集。只匹配字母和数字。匹配一定范围内的字符串集。当从一个文件或命令输出中抽取或过滤文本时,可以使用正则表达式(R E),正则表达式是一些特殊或不很特殊的字符串模式的集合。为了抽取或获得信息,我们给出抽取操作应遵守的一些规则。这些规则由
2、一些特殊字符或进行模式匹配操作时使用的元字符组成。也可以使用规则字符作为模式中的一部分进行搜寻。例如,A将查询A,x将查找字母x。系统自带的所有大的文本过滤工具在某种模式下都支持正则表达式的使用,并且还包括一些扩展的元字符集。这里只涉及其中之一,即以字符出现情况进行匹配的表达式,原因是一些系统将这类模式划分为一组形成基本元字符的集合。这是一个好想法,本书也采用这种方式。本章设计的基本元字符使用在g r e p和s e d命令中,同时结合 (以字符出现情况进行匹配的元字符)使用在a w k语言中。表7-1 基本元字符集及其含义只只匹配行首$只只匹配行尾*只一个单字符后紧跟*,匹配0个或多个此单字
3、符 只匹配 内字符。可以是一个单字符,也可以是字符序列。可以使用-表示 内字符序列范围,如用 1-5 代替 1 2 3 4 5 只用来屏蔽一个元字符的特殊含义。因为有时在 s h e l l中一些元字符有特殊含义。可以使其失去应有意义.只匹配任意单字符p a t t e r n n 只用来匹配前面p a t t e r n出现次数。n为次数p a t t e r n n,m只含义同上,但次数最少为np a t t e r n n,m 只含义同上,但p a t t e r n出现次数在n与m之间现在详细讲解其中特殊含义。第二部分文 本 过 滤7.1 使用句点匹配单字符句点“.”可以匹配任意单字符
4、。例如,如果要匹配一个字符串,以 b e g开头,中间夹一个任意字符,那么可以表示为b e g.n,“.”可以匹配字符串头,也可以是中间任意字符。在ls-l命令中,可以匹配一定权限:.x.x.x此格式匹配用户本身,用户组及其他组成员的执行权限。假定正在过滤一个文本文件,对于一个有 1 0个字符的脚本集,要求前 4个字符之后为X C,匹配操作如下:.X C.以上例子解释为前4个字符任意,5,6字符为X C,后4个字符也任意,按下例运行:注意,“”允许匹配A S C I I集中任意字符,或为字母,或为数字。7.2 在行首以匹配字符串或字符序列只允许在一行的开始匹配字符或单词。例如,使用 ls-l命
5、令,并匹配目录。之所以可以这样做是因为ls-l命令结果每行第一个字符是d,即代表一个目录。回到脚本(1),使用 0 0 1,结果将匹配每行开始为0 0 1的字符串或单词:可以将各种模式结合使用,例如:.4 X C.结果为:50第二部分 文 本 过 滤下载以上模式表示,在每行开始,匹配任意 3个字符,后跟4 X C,最后为任意4个字符。在正则表达式中使用频繁,因为大量的抽取操作通常在行首。在行首第4个字符为1,匹配操作表示为:.1结果为:行首前4个字符为c o m p,匹配操作表示为:c o m p假定重新定义匹配模式,行首前 4个字符为c o m p,后面紧跟两个任意字符,并以 i n g结尾
6、,一种方法为:c o m p.i n g以上例子太明显了,不是很有用,但仍讲述了混合使用正则模式的基本概念。7.3 在行尾以$匹配字符串或字符可以说$与正相反,它在行尾匹配字符串或字符,$符号放在匹配单词后。假定要匹配以单词t r o u b l e结尾的所有行,操作为:t r o u b l e$类似的,使用1 d$返回每行以1 d结尾的所有字符串。如果要匹配所有空行,执行以下操作:$具体分析为匹配行首,又匹配行尾,中间没有任何模式,因此为空行。如果只返回包含一个字符的行,操作如下:.$不像空白行,在行首与行尾之间有一个模式,代表任意单字符。如果在行尾匹配单词j e t 0 1,操作如下:j
7、 e t 0 1$7.4 使用*匹配字符串中的单字符或其重复序列使用此特殊字符匹配任意字符或字符串的重复多次表达式。例如:c o m p u*t将匹配字符u一次或多次:另一个例子:1 0 1 3 3*匹配第7章 正则表达式介绍51下载7.5 使用屏蔽一个特殊字符的含义有时需要查找一些字符或字符串,而它们包含了系统指定为特殊字符的一个字符。什么是特殊字符?一般意义上讲,下列字符可以认为是特殊字符:假定要匹配包含字符“.”的各行而“,”代表匹配任意单字符的特殊字符,因此需要屏蔽其含义。操作如下:.上述模式不认为反斜杠后面的字符是特殊字符,而是一个普通字符,即句点。假定要匹配包含的各行,将反斜杠放在
8、它前面就可以屏蔽其特殊含义。如下:如果要在正则表达式中匹配以*.p a s结尾的所有文件,可做如下操作:*.p a s即可屏蔽字符*的特定含义。7.6 使用匹配一个范围或集合使用 匹配特定字符串或字符串集,可以用逗号将括弧内要匹配的不同字符串分开,但并不强制要求这样做(一些系统提倡在复杂的表达式中使用逗号),这样做可以增加模式的可读性。使用“-”表示一个字符串范围,表明字符串范围从“-”左边字符开始,到“-”右边字符结束。如果熟知一个字符串匹配操作,应经常使用 模式。假定要匹配任意一个数字,可以使用:0 1 2 3 4 5 6 7 8 9 然而,通过使用“-”符号可以简化操作:0-9 或任意小
9、写字母 a-z 要匹配任意字母,则使用:A-Z a-z 表明从A-Z、a-z的字母范围。如要匹配任意字母或数字,模式如下:A-Z a-z 0-9 在字符序列结合使用中,可以用 指出字符范围。假定要匹配一单词,以 s开头,中间有一任意字母,以t结尾,那么操作如下:sa-z A-Zt52第二部分 文 本 过 滤下载上述过程返回大写或小写字母混合的单词,如仅匹配小写字母,可使用:s a-z t如要匹配C o m p u t e r或c o m p u t e r两个单词,可做如下操作:C c o m p u t e r为抽取诸如S c o u t、s h o u t、b o u g h t等单词,使
10、用下列表达式:ou.*t匹配以字母o或u开头,后跟任意一个字符任意次,并以 t结尾的任意字母。也许要匹配所有包含s y s t e m后跟句点的所有单词,这里S可大写或小写。使用如下操作:S,s y s t e m .在指定模式匹配的范围或限制方面很有用。结合使用*与 更是有益,例如 A-Z a-Z *将匹配所有单词。A-Z a-z *注意符号的使用,当直接用在第一个括号里,意指否定或不匹配括号里内容。a-zA-Z 匹配任一非字母型字符,而 0-9 匹配任一非数字型字符。通过最后一个例子,应可猜知除了使用,还有一些方法用来搜索任意一个特殊字符。7.7 使用匹配模式结果出现的次数使用*可匹配所有
11、匹配结果任意次,但如果只要指定次数,就应使用 ,此模式有三种形式,即:patternn 匹配模式出现n次。patternn,匹配模式出现最少n次。patternn,m 匹配模式出现n到m次之间,n,m为0-2 5 5中任意整数。请看第一个例子,匹配字母A出现两次,并以B结尾,操作如下:A 2 B匹配值为A A B匹配A至少4次,使用:A 4,B可以得结果A A A A B或A A A A A A A B,但不能为A A A B。如给出出现次数范围,例如A出现2次到4次之间:A 2,4 B则结果为A A B、A A A B、A A A A B,而不是A B或A A A A A B等。假定从下述列
12、表中抽取代码:格式如下:前4个字符是数字,接下来是x x,最后4个也是数字,操作如下:第7章 正则表达式介绍53下载 0-9 4 X X 0-9 4 具体含义如下:1)匹配数字出现4次。2)后跟代码x x。3)最后是数字出现4次。结果为:在写正则表达式时,可能会有点难度或达不到预期效果,一个好习惯是在写真正的正则表达式前先写下预期的输出结果。这样做,当写错时,可以逐渐修改,以消除意外结果,直至返回正确值。为节省设计基本模式的时间,表 7-2给出一些例子,这些例子并无特别顺序。表7-2 经常使用的正则表达式举例对行首$对行尾 t h e 对以t h e 开头行 S s i g n a l L 对
13、匹配单词 s i g n a l、s i g n a L、S i g n a l、S i g n a LSs i g n a l L.对同上,但加一句点 m a y M A Y 对包含m a y 大写或小写字母的行 U S E R$对只包含U S E R的行t t y$对以t t y 结尾的行.对带句点的行 d .x .x .x对对用户、用户组及其他用户组成员有可执行权限的目录 l 对排除关联目录的目录列表.*0 对0 之前或之后加任意字符 0 0 0 *对0 0 0或更多个 i I 对大写或小写I i I n N 对大写或小写i 或n$对空行 .*$对匹配行中任意字符串.$对包括6 个字符的
14、行a-z A-Z对任意单字符 a -z a -z *对至少一个小写字母 0 -9$对非数字或美元标识 0 -0 A -Z a -z 对非数字或字母 1 2 3 对1到3 中一个数字 D d e v i c e对单词d e v i c e 或D e v i c eD e .c e对前两个字母为D e,后跟两个任意字符,最后为c e54第二部分 文 本 过 滤下载(续)q对以 q 开始行.$对仅有一个字符的行.0-9 0-9 对以一个句点和两个数字开始的行 D e v i c e 对单词d e v i c eD e V v i c e .对单词D e v i c e 或d e v i c e 0
15、-9 2 -0 -9 2 -0 -9 4 对日期格式d d -m m-y y y y 0 -9 3 .0 -9 3 .0 -9 3 .0 -9 3 对I P地址格式n n n.n n n.n n n.n n n .*$对匹配任意行7.8 小结在s h e l l编程中,一段好的脚本与完美的脚本间的差别之一,就是要熟知正则表达式并学会使用它们。相比较起来,用一个命令抽取一段文本比用三四个命令得出同样的结果要节省许多时间。既然已经学会了正则表达式中经常使用的基本特殊字符,又通过一些例子简化了其复杂操作,那么现在可以看一些真正的例程了。好,下面将讲述大量的g r e p,s e d和a w k例程。第7章 正则表达式介绍55下载