linux shell编程指南第七章------正则表达式介绍

来源:互联网 发布:淘宝河北邢台羊绒衫 编辑:程序博客网 时间:2024/06/04 19:48

当从一个文件或命令输出中抽取或过滤文本时,可以使用正则表达式( R E),正则表达式
是一些特殊或不很特殊的字符串模式的集合。
为了抽取或获得信息,我们给出抽取操作应遵守的一些规则。这些规则由一些特殊字符
或进行模式匹配操作时使用的元字符组成。也可以使用规则字符作为模式中的一部分进行搜
寻。例如,A将查询A,x将查找字母x。
系统自带的所有大的文本过滤工具在某种模式下都支持正则表达式的使用,并且还包括
一些扩展的元字符集。这里只涉及其中之一,即以字符出现情况进行匹配的表达式,原因是
一些系统将这类模式划分为一组形成基本元字符的集合。这是一个好想法,本书也采用这种
方式。

本章设计的基本元字符使用在g r e p和s e d命令中,同时结合{ \ \ }(以字符出现情况进行匹配的元字符)使用在a w k语言中。


句点“.”可以匹配任意单字符。例如,如果要匹配一个字符串,以b e g开头,中间夹一个
任意字符,那么可以表示为b e g . n,“.”可以匹配字符串头,也可以是中间任意字符。
在ls -l命令中,可以匹配一定权限:
. . . x . . x . . x

[root@localhost huangcd]# ls -al|grep ...x..x..x
drwxr-xr-x  4 root    root        4096 2011-05-11 ..
-rwxr-xr-x  1 root    root        7093 10-26 23:45 a.out
drwxrwxrwx  2 huangcd huangcd     4096 12-10 20:54 c
drwxr-xr-x  2 huangcd huangcd     4096 10-26 22:50 Desktop
drwxrwxr-x  3 huangcd huangcd     4096 10-25 20:21 .gnome
drwxrwxr-x  2 huangcd huangcd     4096 10-26 22:01 .gstreamer-0.10
drwxr-xr-x  3 huangcd huangcd     4096 10-25 19:47 .kde

注意,“.”允许匹配A S C I I集中任意字符,或为字母,或为数字。


^只允许在一行的开始匹配字符或单词。例如,使用ls -l命令,并匹配目录。之所以可以
这样做是因为ls -l命令结果每行第一个字符是d,即代表一个目录。

[root@localhost huangcd]# ls -al |grep ^d
drwx------ 21 huangcd huangcd     4096 12-18 14:36 .
drwxr-xr-x  4 root    root        4096 2011-05-11 ..
drwxrwxrwx  2 huangcd huangcd     4096 12-10 20:54 c
drwx------  2 huangcd huangcd     4096 10-25 20:21 .chewing
drwxr-xr-x  2 huangcd huangcd     4096 10-26 22:50 Desktop

在行首第4个字符为1,匹配操作表示为:
^ . . . 1

行首前4个字符为c o m p,匹配操作表示为:
^ c o m p
假定重新定义匹配模式,行首前4个字符为c o m p,后面紧跟两个任意字符,并以i n g结尾,
一种方法为:
^ c o m p . . i n g


可以说$与^正相反,它在行尾匹配字符串或字符, $符号放在匹配单词后。假定要匹配以
单词t r o u b l e结尾的所有行,操作为:
t r o u b l e $
类似的,使用1 d $返回每行以1 d结尾的所有字符串。

如果要匹配所有空行,执行以下操作:
^ $
具体分析为匹配行首,又匹配行尾,中间没有任何模式,因此为空行。
如果只返回包含一个字符的行,操作如下:
^ . $
不像空白行,在行首与行尾之间有一个模式,代表任意单字符。
如果在行尾匹配单词j e t 0 1,操作如下:
j e t 0 1 $


可以使用*特殊字符匹配任意字符或字符串的重复多次表达式。例如:
c o m p u * t
将匹配字符u一次或多次:

computer

computing

compuuuute


有时需要查找一些字符或字符串,而它们包含了系统指定为特殊字符的一个字符。什么
是特殊字符?一般意义上讲,下列字符可以认为是特殊字符:

$   .    '    "   *   [ ]   ^   |   ()   \   +   ?
假定要匹配包含字符“ .”的各行而“,”代表匹配任意单字符的特殊字符,因此需要屏蔽
其含义。操作如下:
\ .
上述模式不认为反斜杠后面的字符是特殊字符,而是一个普通字符,即句点。
假定要匹配包含^的各行,将反斜杠放在它前面就可以屏蔽其特殊含义。如下:
\ ^
如果要在正则表达式中匹配以* . p a s结尾的所有文件,可做如下操作:
\ * \ . p a s
即可屏蔽字符*的特定含义。


使用[ ]匹配特定字符串或字符串集,可以用逗号将括弧内要匹配的不同字符串分开,但并
不强制要求这样做(一些系统提倡在复杂的表达式中使用逗号),这样做可以增加模式的可读
性。
使用“ -”表示一个字符串范围,表明字符串范围从“ -”左边字符开始,到“ -”右边字
符结束。
如果熟知一个字符串匹配操作,应经常使用[ ]模式。
假定要匹配任意一个数字,可以使用:
[ 0 1 2 3 4 5 6 7 8 9 ]
然而,通过使用“-”符号可以简化操作:
[ 0 - 9 ]
或任意小写字母
[ a - z ]
要匹配任意字母,则使用:
[ A - Z a - z ]
表明从A - Z、a - z的字母范围。
如要匹配任意字母或数字,模式如下:
[ A - Z a - z 0 - 9 ]
在字符序列结合使用中,可以用[ ]指出字符范围。假定要匹配一单词,以s开头,中间有
一任意字母,以t结尾,那么操作如下:
s[a-z A-Z]t

上述过程返回大写或小写字母混合的单词,如仅匹配小写字母,可使用:
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等单词,使用下列表达式:
[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 ]

匹配任一非数字型字符。


使用*可匹配所有匹配结果任意次,但如果只要指定次数,就应使用\ { \ },此模式有三种
形式,即:
pattern\{n\} 匹配模式出现n次。
pattern\{n,\} 匹配模式出现最少n次。
pattern\{n,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等。

前4个字符是数字,接下来是x x,最后4个也是数字,操作如下:

[ 0 - 9 ] \ { 4 \ }X X[ 0 - 9 ] \ { 4 \ }

在写正则表达式时,可能会有点难度或达不到预期效果,一个好习惯是在写真正的正则
表达式前先写下预期的输出结果。这样做,当写错时,可以逐渐修改,以消除意外结果,直
至返回正确值。为节省设计基本模式的时间,表7 - 2给出一些例子,这些例子并无特别顺序。




原创粉丝点击