补充,正则表达式(完整稿)

上传人:woxinch****an2018 文档编号:39307864 上传时间:2018-05-14 格式:DOC 页数:20 大小:1.32MB
返回 下载 相关 举报
补充,正则表达式(完整稿)_第1页
第1页 / 共20页
补充,正则表达式(完整稿)_第2页
第2页 / 共20页
补充,正则表达式(完整稿)_第3页
第3页 / 共20页
补充,正则表达式(完整稿)_第4页
第4页 / 共20页
补充,正则表达式(完整稿)_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《补充,正则表达式(完整稿)》由会员分享,可在线阅读,更多相关《补充,正则表达式(完整稿)(20页珍藏版)》请在金锄头文库上搜索。

1、第第 3 章章 正则表达式正则表达式 由于很多 Linux Shell 编程的工具和命令普遍使用到了正则表达式,如 grep、sed 和 awk 等,因此,不理解正则表达式就无法理解和熟练地使用 Shell 编程的工具和命令。为此,本 章首先深入介绍正在表达式的基础知识,详细讨论基本正则表达式和扩展正则表达式中元 字符的意义和用法。然后,介绍 Shell 在搜索匹配文件时经常使用的机制通配,通配所 用到的元字符与正则表达式存在细微差别,本章结合例子逐个讨论通配的元字符。最后, 介绍 Linux 系统中使用广泛的 grep 命令,着重讨论 grep 命令的基本用法,及如何与正则表 达式相结合,以

2、便更加灵活地进行文本搜索,此外,还将简单介绍 grep 命令族中的其他两 个命令 egrep 和 fgrep。 3.1 正则表达式基础正则表达式基础 Linux Shell 以一串字符作为表达式向系统传达意思。元字符(Metacharacters)是用来 阐释字符表达式意义的字符,简言之,元字符就是描述字符的字符,它用于对字符表达式 的内容、转换及各种操作信息进行描述。正则表达式是由一串字符和元字符构成的字符串, 简称 RE(Regular Expression) 。正则表达式的主要功能是文本查询和字符串操作,它可以匹 配文本的一个字符或字符集合。 在 Linux 系统中,程序设计语言 Jav

3、a、Perl 和 Python 等,Shell 工具 sed、awk 和 grep 等,MySQL 和 PostgreSQL 等数据库服务器都使用了正则表达式,图 3-1 描述了正则表达式 用于数据流处理的过程,实际上,正则表达式完成了数据过滤,将不满足正则表达式定义 的数据拒绝掉,剩下与正则表达式匹配的数据。图 3-1 正则表达式处理数据过程正则表达式的基本元素包括普通字符和元字符,例如,a、b、1、2 等字符属于普通字 符,普通字符可以按照字面意思理解,如:a 只能理解为英文的小写字母 a,没有其他隐藏 含义。而*、等元字符,Shell 赋予了它们超越字面意思的意义,如:*符号的字面意义

4、只是一个符号,而实际上却表示了重复前面的字符 0 次或多次的隐藏含义。因此,掌握正 则表达式基本元素主要是对正则表达式中元字符意义的掌握。 POSIX 标准将正则表达式分为两类:基本的正则表达式和扩展的正则表达式,大部分 Linux 应用和工具仅支持基本的正则表达式,因而,本节所述的正则表达式基础是掌握正则 表达式的关键,表 3-1 列出了基本的正则表达式中元字符集合及其意义。 表 3-1 基本的正则表达式元字符集合及其意义符符 号号意意 义义*0 个或多个在*字符之前的那个普通字符数据流匹配的数据正则表达式过滤的数据.匹配任意字符匹配行首,或后面字符的非$匹配行尾匹配字符集合转义符,屏蔽一个

5、元字符的特殊意义精确匹配符号n匹配前面字符出现 n 次n,匹配前面字符至少出现 n 次n,m匹配前面字符出现 nm 次下面逐个介绍正则表达式元字符的意义和用法,并举一些例子结合使用元字符集合。1. “*”符号 “*”符号用于匹配前面一个普通字符的 0 次或多次重复,如:“*”符号前面的普通字符是 1,*字符就表示匹配 1 字符 0 次或多次,如字符串 helo、hello、hellllllo 都可以由 hel*o 来表示。2. “.”符号 点号“.”用于匹配任意一个字符,如:由于“.”符号只能匹配一个字符,因此,上述字符串表示前面三个字符为任意字符, 第 4 和第 5 个字符是 7 和 3,最

6、后一个字符为任意字符,如 xcb738、4J973U 都能匹配上述 字符串。值得注意的是, “.”符号可以匹配一个空格,因此,x b738,ui 73e 也能匹配上述 字符串。3. “”符号 “”符号用于匹配行首,表示行首的字符是“”字符后面的那个字符,如:这表示匹配以 cloud 开头的行。结合上面介绍的“*”符号和“.”符号,再举一个例子:该字符串表示行首的三个字符为任意字符(可以是空格) ,第 46 个字符为 X86,第 7 个字符开始可以重复匹配 6,如:866X86666、8 6X86 都可以匹配上述字符串。4. “$”符号 “$”符号匹配行尾, “$”符号放在匹配字符之后,与“”符

7、号的功能和用法都相反。 如:该正则表达式表示匹配以 micky 结尾的所有行。一个特殊的正则表达式是匹配所有空 行的表达式,为:该正则表达式既匹配行首,又匹配行尾,中间没有任何字符,因此,为空行。读者需 要牢记例 3-6 所示的空行表示方法,很多命令都用到这个正则表达式来表示空行。 如果需要匹配只包含一个字符的行,如下面的例 3-7 所示:5. “”符号 方括号“”匹配字符集合,该符号支持穷举方法列出字符集合的所有元素,也支持 使用“-”符号表示字符集合范围,表明字符集合范围从“-”左边字符开始,到“-”右边 字符结束。如果要匹配任意一个数字,可以使用如例 3-8 所示的两种方法,前一种穷举了

8、 阿拉伯数字,后一种用数字范围表示,显得比较简洁。“”也可以用做字母匹配,例 3-9 给出了匹配字母的例子:Linux 系统对大小写是敏感的,并且支持字母排序,因此,Linux 中有大写字母序列和 小写字母序列,两者是分开的,例 3-9 中 az 表示所有的小写字母,AZ 表示所有的大写 字母,而 bp 表示从 b 到 p 之间所有的小写字母。 我们知道, “”符号表示匹配行首,但是, “”符号放到“”符号中就不再表示匹 配行首了,而是表示取反符号,请看下面的例 3-10。例 3-10 的正则表达式匹配不在 bd 范围之内的所有字符,此时,符号“”不再表示 匹配行首,而是取反符号,不在 bd

9、范围内的字符实际上涵盖了除了小写字母 b、c 和 d 之外的所有字符(包括其他字母、数字、空格等) 。再举一个“”符号和“*”符号结合 的例子。例 3-11 的正则表达式表示以任意一个字母开头,再以任意字母进行 0 次或任意次重复, 实际上,这个正则表达式可以匹配任意英文单词。6. “”符号“”符号是转义符,用于屏蔽一个元字符的特殊意义,即以字面含义来解释“”符 号后面的元字符,如:反斜杠后面的字符“.”是元字符,经过转义后, “.”不再表示任意一个字符,而是一 个普通字符句号“.” 。转义符“”是引用符的一种,我们将在 6.2.3 节深入讨论它,在此 不再展开论述。7. “”符号 “”符号是

10、精确匹配符号,该符号利用“”符号屏蔽“”符号,如:该正则表达式精确匹配 the 这个单词,而不匹配包含 the 字符的单词,如 them、there、another 等。8. “”系列符号 “”系列符号与“*”符号类似,都是表示前一个字符的重复。但是, “*”符号表 示重复 0 次或任意次,而“”系列符号可以指定重复次数, “”系列符号包括以下三 种形式。 n:匹配前面字符出现 n 次。 n, :匹配前面字符至少出现 n 次。 n,m:匹配前面字符出现 nm 次。 请看下面的例 3-14。JO3B 表示重复字符 O 3 次,匹配值为:JOOOB。 JO3,B 表示重复字符 O 至少 3 次,J

11、OOOB、JOOOOB、JOOOOOB 等字符串都可由该 正则表达式来匹配。 JO3,6B 表示重复字符 O 至少 3 次,至多 6 次,JOOOB、JOOOOOOB 等字符串都满足, 但是 JOOB、JOOOOOOOB 等字符串就不满足。 再举一个例子:例 3-15 中的表达式表示精确匹配 5 个小写英文字母,比如 hello、house 等。3.2 正则表达式的扩展正则表达式的扩展 除了表 3-1 列出的正则表达式的元字符之外,awk 和 Perl 等 Linux 工具还支持正则表达 式扩展出来的一些元字符,这些元字符如表 3-2 所示。表 3-2 扩展的正则表达式元字符集合及其意义符符

12、号号意意 义义?匹配 0 个或 1 个在其之前的那个普通字符+匹配 1 个或多个在其之前的那个普通字符()表示一个字符集合或用在 expr 中|表示“或” ,匹配一组可选的字符下面详细介绍扩展的正则表达式元字符及其用法。1. “?”符号 匹配“?”符号之前的那个字符 0 次或 1 次,如:该表达式表示匹配 O 字符 0 次或 1 次,即匹配 JOB 或 JOOB。需要注意的是, “?”字 符至多可以匹配 1 个字符。2. “+”符号 与“*”符号类似,都是匹配其前面的那个字符多次,但是, “*”符号可以匹配 0 次, 而“+”符号至少匹配 1 次,如:该表达式表示匹配 S 1 次或任意次,SS

13、EU、SSSSEU 等字符串都可由该表达式进行匹配, 而 SEU 却不能由 S+EU 来匹配。3. “()”符号和“|”符号 “()”符号通常与“|”符号结合使用,表示一组可选字符的集合,如:该表达式中的(a|e|o)表示在字符 a、e 和 o 中选择任意一个字符,即 read、reed、reod 都可由该表达式进行匹配。 事实上, “()”符号很少使用到,因为“”符号完全能够替代“()”符号表示一组可选 字符的集合,re(a|e|o)d 就等价于 reaeod。“|”符号也可以表示多个正则表达式的“或”关系,基本格式为:上述格式中,RE1、RE2 和 RE3 表示正则表达式。“|”符号在扩展

14、的正则表达式中表示“或”意义,遗憾的是, “|”符号的这种用法却 很少被人记住, “|”符号最著名的是其管道符用法,这将在第 10 章中详细介绍。3.3 通配通配 bash Shell 本身不支持正则表达式,使用正则表达式的是 Shell 命令和工具,如 grep、sed、awk 等,这些命令将在本书后续章节详细介绍。但是,bash Shell 可以使用正则 表达式中的一些元字符实现通配(Globbing)功能,通配是把一个包含通配符的非具体文 件名扩展存储在计算机、服务器或者网络上的一批具体文件名的过程。最常用的通配符包 括正则表达式元字符:?、*、等。这些元字符在通配中的意义与正则表达式中

15、的 意义不完全一致,*符号不再表示其前面字符的重复,而是表示任意位的任意字符,?符号 表示任意字符,符号在通配中不代表行首,而是代表取反。 例如,如果一个用户不知道在一个扩展名为.rtf 的文件名中一个人的首名是如何拼写的, 是 Philip 还是 Phillip。这个用户可以输入:下面举几个例子来说明通配的使用和通配元字符的意义,这些例子都用 ls 命令进行通 配,ls 命令是 Linux 下最常用的命令之一,它用于列出目录下的文件,它可以有很多选项, ls -l 表示列出文件的详细信息,ll 命令等价于 ls -l 命令。/usr/local/globus 目录下的所有文件 如下所示:/u

16、sr/local/globus 目录下包含一个子目录 BUILD,子目录的详细信息以 d 开头,d 表示 directory 的意思,其他以横杠(-)开头的都是文件。 如果我们仅需要列出/usr/local/globus 目录下以.awk 结尾的文件,就可以使用*.awk 匹 配所有以.awk 结尾的文件,如下面的例 3-19 所示。如果我们需列出以 0 开头、后面跟 1 个字符且以.pem 为后缀的文件,可以使用 0?.pem 来匹配这些文件,如下面的例 3-20 所示。下面举一个用符号进行通配的例子,若我们需列出在 ah 范围内以字母开头并以. awk 结尾的文件,我们可以用a-h*.awk 来匹配这些文件,如下面的例 3-21 所示。例 3-21 的结果确实仅列出以 ah 范围内字母开头且以.awk 结尾的文件,pa

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号