Shell编程学习---第七篇:正则表达式

随着对unix和Linux熟悉程度的不断加深,需要经常接触到正则表达式这个领域。使用
shell时,从一个文件中抽取多于一个字符串将会很麻烦。例如,在一个文本中抽取一个词,
它的头两个字符是大写的,后面紧跟四个数字。如果不使用某种正则表达式,在shell中将不
能实现这个操作。
本章内容包括:
•  匹配行首与行尾。
•  匹配数据集。
•  只匹配字母和数字。
•  匹配一定范围内的字符串集。
当从一个文件或命令输出中抽取或过滤文本时,可以使用正则表达式(RE) ,正则表达式
是一些特殊或不很特殊的字符串模式的集合。
为了抽取或获得信息,我们给出抽取操作应遵守的一些规则。这些规则由一些特殊字符
或进行模式匹配操作时使用的元字符组成。也可以使用规则字符作为模式中的一部分进行搜
寻。例如, A将查询A,x将查找字母 x。
系统自带的所有大的文本过滤工具在某种模式下都支持正则表达式的使用,并且还包括
一些扩展的元字符集。这里只涉及其中之一,即以字符出现情况进行匹配的表达式,原因是
一些系统将这类模式划分为一组形成基本元字符的集合。这是一个好想法,本书也采用这种
方式。
本章设计的基本元字符使用在grep和sed命令中,同时结合{\\}(以字符出现情况进行匹配
的元字符)使用在awk语言中。

7.1使用句点匹配单字符
句点“.”可以匹配任意单字符。例如,如果要匹配一个字符串,以beg开头,中间夹一个
任意字符,那么可以表示为beg.n, “.”可以匹配字符串头,也可以是中间任意字符
注意, “.”允许匹配ASCII集中任意字符,或为字母,或为数字。

7.2 在行首以^匹配字符串或者字符序列
^只允许在一行的开始匹配字符或单词


7.3 在行尾以$匹配字符串或字符
可以说$与^正相反,它在行尾匹配字符串或字符, $符号放在匹配单词后。假定要匹配以
单词trouble结尾的所有行,操作为:trouble$
类似的,使用1d$返回每行以1d结尾的所有字符串。
如果要匹配所有空行,执行以下操作:
^ $
具体分析为匹配行首,又匹配行尾,中间没有任何模式,因此为空行。
如果只返回包含一个字符的行,操作如下:
^ . $
不像空白行,在行首与行尾之间有一个模式,代表任意单字符。
如果在行尾匹配单词jet01,操作如下:
jet01$

7.4使用*匹配字符串中的单字符或其重复序列

7.5使用\屏蔽一个特殊字符的含
有时需要查找一些字符或字符串,而它们包含了系统指定为特殊字符的一个字符。什么
是特殊字符?一般意义上讲,下列字符可以认为是特殊字符:
$.'"*[]^|()\+?
假定要匹配包含字符“.”的各行而“,”代表匹配任意单字符的特殊字符,因此需要屏蔽
其含义。操作如下:
\ .
上述模式不认为反斜杠后面的字符是特殊字符,而是一个普通字符,即句点。
假定要匹配包含^的各行,将反斜杠放在它前面就可以屏蔽其特殊含义。如下:
\ ^
如果要在正则表达式中匹配以 *.pas结尾的所有文件,可做如下操作:
\*\.pas
即可屏蔽字符*的特定含义。

7.6 使用[]匹配一个范围或集合
使用[ ]匹配特定字符串或字符串集,可以用逗号将括弧内要匹配的不同字符串分开,但并
不强制要求这样做(一些系统提倡在复杂的表达式中使用逗号) ,这样做可以增加模式的可读
性。
使用“-”表示一个字符串范围,表明字符串范围从“-”左边字符开始,到“-”右边字
符结束。
如果熟知一个字符串匹配操作,应经常使用[]模式。
假定要匹配任意一个数字,可以使用:
[ 0 1 2 3 4 5 6 7 8 9 ]
然而,通过使用“-”符号可以简化操作:
[0-9]
或任意小写字母
[a - z]
要匹配任意字母,则使用:
[A-Za-z]
表明从A-Z、a-z的字母范围。
如要匹配任意字母或数字,模式如下:
[A-Za-z0-9]
在字符序列结合使用中,可以用 [] 指出字符范围。假定要匹配一单词,以s开头,中间有
一任意字母,以t结尾,那么操作如下:
s[a-z A-Z]t
上述过程返回大写或小写字母混合的单词,如仅匹配小写字母,可使用:
s [ a - z ] t
如要匹配Computer或computer两个单词,可做如下操作:
[Cc]omputer
为抽取诸如 Scout、shout、bought等单词,使用下列表达式:
[ou] .*t
匹配以字母 o或u开头,后跟任意一个字符任意次,并以 t结尾的任意字母。
也许要匹配所有包含system后跟句点的所有单词,这里 S可大写或小写。使用如下操作:
[S,s]ystem\.
[ ]在指定模式匹配的范围或限制方面很有用。结合使用 *与[]更是有益,例如 [A-Za-Z] *将
匹配所有单词。
[A-Za-z]*
注意^符号的使用,当直接用在第一个括号里,意指否定或不匹配括号里内容。
[^a-zA-Z]
匹配任一非字母型字符,而
[^0-9]
匹配任一非数字型字符。
通过最后一个例子,应可猜知除了使用 ^,还有一些方法用来搜索任意一个特殊字符

7.7 使用\{\}匹配模式结果出现的次
使用*可匹配所有匹配结果任意次,但如果只要指定次数,就应使用\{\},此模式有三种
形式,即:
pattern\{n\}  匹配模式出现n次。
pattern\{n,\}  匹配模式出现最少 n次。
pattern\{n,m}  匹配模式出现n到m次之间,n , m为0-255中任意整数。

                                       常用的正则表达式


^                                                                      对行首
$                                                                     对行尾
^[the]                                                               对以the开头行
[Ss]igna[lL]                                                   对匹配单词 signal Signal signaL, SignaL
[Ss]igna[lL]\.                                                 对同上,但加一句点
[ mayMAY]                                                    对包含may大写或小写字母的行
^USER$                                                        对只包含USER的行
[tty]$                                                                 对以tty结尾的行
\.                                                                        对带句点的行
^d..x..x..x                                                        对对用户、用户组及其他用户组成员有可执行权限的目录
^[^l]                                                                 对排除关联目录的目录列表
[.*0]                                                                 对0之前或之后加任意字符
[000*]                                                               对000或更多个
[iI]                                                                      对大写或小写I
[iI][nN]                                                               对大写或小写i或n
[^$]                                                                    对空行
[^.*$]                                                                 对匹配行中任意字符串
^......$                                                               对包括6个字符的行
[a-zA-Z]                                                           对任意单字符
[a-z][a-z]*                                                        对至少一个小写字母
[^0-9\$]                                                            对非数字或美元标识
[^0-0A-Za-z]                                                   对非数字或字母
[123]                                                                 对1到3中一个数字
[Dd]evice                                                        对单词device或Device
De..ce                                                              对前两个字母为 De,后跟两个任意字符,最后为ce
\^q                                                                     对以^q开始行
^.$                                                                     对仅有一个字符的行
^\.[0-9][0-9]                                                      对以一个句点和两个数字开始的行
'"Device"'                                                          对单词device
De[Vv]ice\.                                                       对单词Device或device
[0-9]\{2\}-[0-9]\{2\}-[0-9]\{4\}                           对日期格式dd-mm-yyyy
[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}         对IP地址格式nnn.nnn.nnn.nnn
[^.*$]                                                                  对匹配任意行


你可能感兴趣的:(Shell编程学习---第七篇:正则表达式)