




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章正则表达式本章主要涉及到的知识点有:什么是正则表达式:主要介绍什么是正则表达式,为什么要学习正则表达式以及如何学习和实践正则表达式。正则表达式基础:主要介绍正则表达式的元字符、扩展元字符,如何匹配单个字符,如何匹配多个字符,如何匹配字符串的开头或者结尾以及运算符的优先级。grep命令:主要介绍grep命令的基本语法,正则表达式在grep命令中的应用以及grep命令族中的其他的命令简介。8.1什么是正则表达式所谓正则表达式,实际上就是用来描述某些字符串匹配规则的工具。由于正则表达式语法简练,功能强大,得到了许多程序设计语言的支持,包括Java、C++、Perl以及Shell等。对于初学者来说,首次接触正则表达式非常难以接受,本节将介绍正则表达式的入门知识,以利于后面几节的学习。8.1.1为什么使用正则表达式在进行程序设计的过程中,用户会不可避免地遇到处理某些文本的情况。有的时候,用户还需要查找符合某些比较复杂规则的字符串。对于这些情况,如果单纯依靠程序设计语言本身,则往往会使得用户通过复杂的代码来来实现。但是,如果使用正则表达式,则会以非常简短的代码来完成。8.1.2如何学习正则表达式1.重点在于理解元字符2.掌握好正则表达式的语法3.开拓思路,寻找最佳的表达方法8.1.3如何实践正则表达式当一个正则表达式完成之后,并能够保证这个表达式一定是准确的,需要不断地测试才可以确定其正确与否。在不同的环境下,用户需要不同的工具来帮助他完成测试的过程。如果是在Shell命令行中,用户可以使用grep命令来测试。【例8-1】演示如何通过正则表达式来查找字符串#!/bin/bashstr=`catversion.txt|greprev`echo"$str"[root@linuxchapter8]#./ex8-1.shrev=553248.2正则表达式基础通过前面的一节的学习,用户对于正则表达式应该有个初步的了解。本节将在前面一节的基础上,逐步介绍正则表达式的基础知识,主要是各种元字符及其使用方法。8.2.1正则表达式的原理8.2.2基本正则表达式基本正则表达式(BasicRegularExpression,BRE),又称为标准正则表达式,是最早制订的正则表达式规范,仅支持最基本的元字符集。基本正则表达式是POSIX规范制订的两种正则表达式语法标准之一,另外一种语法标准称为扩展正则表达式,将在随后介绍。基本正则表达式所定义的元字符主要有以下几种。1.行首定位符“^”是正则表达式中的定位符之一,用来匹配行首的字符,表示行首的字符是“^”后面的那个字符。正则表达式中的定位符的作用与其他的元字符不同,它们不是用来匹配具体的文本,而是匹配某个具体的位置,例如行首定位符“^”就是用来匹配文本行的开头的字符的。#!/bin/bash#列出/etc目录中的以字母po开头的文件str=`ls/etc|grep"^po"`echo"$str"[root@linuxchapter8]#./ex8-2.shpolkit-1popt.dportreservepostfix【例8-2】演示行首定位符的用法2.行尾定位符“$”与行首定位符的作用恰恰相反,行尾定位符的作用是用来定位文本行的末尾的。从语法上讲,行尾定位符的位置也与行首定位符相反,行首定位符位于所作用的字符之前,而行尾定位符位于所作用的字符之后。#!/bin/bash#列出/etc目录中以conf结尾的文件名str=`ls/etc|grep"conf$"`echo"$str"[root@linuxchapter8]#./ex8-3.shanthy-confasound.confautofs_ldap_auth.confcas.confcgconfig.conf…【例8-3】演示行尾定位符的使用方法3.单个字符匹配“.”圆点“.”用来匹配任意单个字符,包括空格,但是不包括换行符“\n”。当用户使用“.”符号后,意味着该位置一定有一个字符,无论它是什么字符。#!/bin/bash#列出所有的包含字符串“samba”的文件名str=`ls/etc|grep"samba"`echo"$str"echo"==============================="#列出包含字符串samba以及另外一个字符的文件名str=`ls/etc|grep"samba."`echo"$str"[root@linuxchapter8]#./ex8-4.shsambasamba4===============================samba4【例8-4】演示圆点符号的用法4.限定符“*”星号“*”是正则表达式中的限定符之一。限定符本身不代表任何字符,它是用来指定其前面的一个字符必须要重复出现多少次才能满足匹配。星号“*”表示匹配其前导字符的任意次数,包括0次。#!/bin/bash#筛选出以字符s开头,紧跟着1个字符s,任意个字符s的文件名str=`ls/etc|grep"^sss*"`echo"$str"[root@linuxchapter8]#./ex8-5.shsshsslsssd【例8-5】演示星号通配符的使用方法5.字符集匹配“[]”方括号“[]”的功能比较特殊,它是用来指定一个字符集合的,其基本语法为:[abc]其中a、b和c表示任意的单个字符。如果某个字符串在方括号所在的位置上出现了方括号中的任意一个字符,都是满足匹配规则。另外,对于连续的数字或者字母,可以使用连字符“-”来表示一个范围,例如“[a-f]”表示匹配字母表中a到f中的任意一个字母。而“[0-9]”表示匹配任意单个数字。#!/bin/bash#筛选所有以字符r开头,并且紧跟着1个字符c的文本行str=`ls/etc|grep"^rc"`echo"$str"echo"=============================="#筛选所有以字符r开头,紧跟着1个字符为c,下面1个字符为单个数字的文本行str=`ls/etc|grep"^rc[0-9]"`echo"$str"【例8-6】演示方括号的使用方法[root@linuxchapter8]#./ex8-6.shrcrc0.drc1.drc2.drc3.drc4.drc5.drc6.drc.drc.localrc.sysinit==============================rc0.drc1.drc2.drc3.drc4.drc5.drc6.d6.字符集不匹配“[^]”前面已经介绍过行首定位符“^”和字符集匹配符“[]”。但是如果将这2个符号结合起来,则其意义会发生变化。符号“[^]”表示不匹配其中列出的任意字符,其语法如下:[^abc]其中a、b和c表示任意的单个字符。“[^]”符号的用法与符号“[]”的用法相同,不再举例说明。除了前面介绍的6个元字符之外,在基本正则表达式中还定义了其他的一些元字符。这些元字符使用较少,语法较繁琐,且在扩展正则表达式和PERL正则表达式中都有替代的元字符,所以不再详细说明。表8-1列出了基本正则表达式的其他的元字符。8.2.3扩展正则表达式扩展正则表达式(ExtendedRegularExpression,ERE)支持比基本正则表达式更多的元字符,但是扩展正则表达式对有些基本正则表达式所支持的元字符并不支持。8.2.2中介绍的元字符“^”、“$”、“.”、“*”、“[]”以及“[^]”这6个元字符在扩展正则表达式都得到了支持,并且其意义和用法都完全相同,不再重复介绍。接下来重点介绍一下在扩展正则表达式中新增加的一些元字符。1.限定符“+”前面已经介绍过行首定位符“^”和字符集匹配符“[]”。但是如果将这2个符号结合起来,则其意义会发生变化。符号“[^]”表示不匹配其中列出的任意字符,其语法如下:[^abc]其中a、b和c表示任意的单个字符。“[^]”符号的用法与符号“[]”的用法相同,不再举例说明。除了前面介绍的6个元字符之外,在基本正则表达式中还定义了其他的一些元字符。这些元字符使用较少,语法较繁琐,且在扩展正则表达式和PERL正则表达式中都有替代的元字符,所以不再详细说明。表8-1列出了基本正则表达式的其他的元字符。#!/bin/bash#筛选以字符串“ss”开头,后面至少紧跟着1个字符“s”的文本行str=`ls/etc|egrep"^sss+"`echo"$str"[root@linuxchapter8]#./ex8-7.shsssd【例8-7】演示加号“+”的使用方法2.限定符“?”问号“?”是另外一个限定符,它用来限定前面的字符最多只出现1次,即前面的字符可以重复0次或者1次。#!/bin/bash#筛选以字符串“ss”开头,后面跟着0或者1个s的文本行str=`ls/etc|egrep"^sss?"`echo"$str"[root@linuxchapter8]#./ex8-8.shsshsslsssd【例8-8】演示问号通配符的使用方法3.竖线“|”和圆括号“()”竖线“|”表示多个正则表达式之间“或”的关系,其语法为:expression1|expression2|expression3|…|expressionn圆括号“()”用来表示一组可选值的集合。竖线和圆括号经常在一起使用,表示一组可选值。#!/bin/bash#筛选含有字符串“ssh”、“ssl”或者以字符串“yum”开头的文本行str=`ls/etc|egrep"(ssh|ssl|^yum)"`echo"$str"[root@linuxchapter8]#./ex8-9.shsshsslyumyum.confyum.repos.d【例8-9】演示圆括号和竖线的使用方法8.2.4Perl正则表达式正则表达式是Perl语言的一大特色。Shell中的grep和egrep命令都支持Perl正则表达式。Perl正则表达式的元字符与扩展正则表达式的元字符大致相同,扩展正则表达式中的元字符在Perl正则表达式中都得到了了支持。另外,Perl正则表达式还增加了一些元字符。下面对常用的增加的元字符进行介绍。1.数字匹配\d符号“\d”匹配从0到9中的任意一个数字字符,等价于表达式“[0-9]”。#!/bin/bash#筛选以字符串rc开头,紧跟着一个数字的问本行str=`ls/etc|grep-P"^rc\d"`echo"$str"[root@linuxchapter8]#./ex8-10.shrc0.drc1.drc2.drc3.drc4.drc5.drc6.d【例8-10】演示符号“\d”的使用方法2.非数字匹配\D符号“\D”和符号“\d”的作用恰好相反,后者是匹配一个0~9之间的单个数字字符,而前者则匹配一个非数字字符。“\D”等价于表达式“[^0-9]”。3.空白字符匹配\s符号“\s”匹配任何空白字符,包括空格、制表符以及换页符等,等价于表达式“[\f\n\r\t\v]”。4.非空白字符匹配\S符号“\S”匹配任何非空白字符,等价于表达式“[^\f\n\r\t\v]”。8.2.5正则表达式字符集一个正则表达式就是由一系列字符组成的字符串。其中,包括元字符和普通字符。由于元字符和普通字符都有许多个,所以形成了元字符集和普通字符集这两个集合。在正则表达式中,普通字符集中的字符只表示它们的字面涵义,不对其他的字符产生影响。正则表达式的最简单的形式就是只由普通字符集中的字符组成,不包含元字符。正则表达式的字符集通常使用方括号表达式表示,例如:[cC]hina[^hello][a-zA-Z][0123456789][0-9]与其他的普通字符一样,上表中列出的字符类也需要放在方括号中。例如:[[:alnum:]]等价于以下表达式:[a-zA-Z0-9]8.3正则表达式应用本书在前面的2节中,详细介绍了正则表达式的基础知识。为了使得读者更加清楚如何使用正则表达式,本节将详细介绍正则表达式的相关应用。8.3.1匹配单个字符在正则表达式中,可以用来匹配单个字符的表达式大致有4种,分别是单个一般字符、转义后的元字符、圆点“.”表达式以及方括号表达式。下面分别进行介绍。1.单个一般字符所谓一般字符,是指除了正则表达式中已经定义的元字符之外的所有字符,例如英文字符、数字、空白字符以及标点符号等。这些一般字符组正则表达式中都只是表达它们自身的字面意义,没有其他额外的意义。当需要匹配某个一般字符时,可以直接将该字符作为表达式或者是表达式的一部分。#!/bin/bash#搜索含有字符“a”的文本行str=`grep"a"demo2.txt`echo"$str"【例8-11】演示如何使用普通字符作为表达式来匹配单个字符[root@linuxchapter8]#./ex8-11.shtheschoolreportoftheclassisname scorealice 892.转义后的元字符在前面介绍基本正则表达式、扩展正则表达式以及Perl正则表达式的时候,都介绍了一些元字符。如果想要匹配这些元字符本身,则需要在这些字符的前面加上转义字符“\”。通过这样操作,可以关闭这些元字符的特殊意义,而只保留其字面意义。例如,如果想要匹配圆点“.”就可以使用表达式“\.”。经过转义之后,这个表达式就表示一个圆点符号,而不是任意单个字符。如果想要匹配其他的元字符,例如问号“?”,同样可以使用表达式“\?”。#!/bin/bashstr=`grep"."demo3.txt`echo"$str"[root@linuxchapter8]#./ex8-12.shNomatterwhatyou'relookingfor,ourmottois"keepitsimple"Startbyenteringabasicnameorword.Ifyou'relookingforaplaceorproductinaspecificlocation,enterthenamealongwiththetownorzipcode.【例8-12】演示直接使用元字符圆点作为表达式,则会导致匹配结果出错3.圆点表达式圆点“.”表示匹配任意单个字符,除了换行符之外。关于圆点表达式的使用方法,请参见例8-4,不再重复介绍。4.方括号表达式前面已经介绍过,方括号表达式用来表示一个可选字符的集合。尽管通常情况下,在方括号中含有多个字符,但是一次只能从这些字符中选择一个,因此,方括号表达式仍然表示的是匹配单个字符。例如,表达式“[abc]”就表示匹配字符“a”、“b”或者“c”中的任意一个。同时,这种表示方法也是最简单的一种形式,也就是直接将所要匹配的字符都在方括号中罗列出来。如果在方括号中的字符列表前面加上符号“^”,则表示取反的意思。也就是说,不匹配方括号中列出来的任何一个字符。例如,表达式“[^abc]”表示不匹配“a”、“b”和“c”这3个字符中的任何一个。8.3.2匹配多个字符
接下来再介绍如何匹配多个字符。正则表达式可以使用多种方法来匹配多个字符,其中最简单的一种就是将多个字符按照指定的顺序拼接起来。#!/bin/bash#搜索字符串“matter”str=`grep"matter"demo3.txt`echo"$str"[root@linuxchapter8]#./ex8-13.shNomatterwhatyou'relookingfor,ourmottois"keepitsimple"【例8-13】演示如何匹配一个有多个字符组成的字符串#!/bin/bash#匹配含有字符“o”,后面紧跟着字符“r”或者“u”的文本行str=`grep"o[ru]"demo3.txt`echo"$str"[root@linuxchapter8]#./ex8-14.shNomatterwhatyou'relookingfor,ourmottois"keepitsimple"Startbyenteringabasicnameorword.Ifyou'relookingforaplaceorproductinaspecificlocation,enterthenamealongwiththetownorzipcode.【例8-14】演示如何将普通字符和方括号表达式混合起来使用#!/bin/bash#匹配任意多个字符“o”str=`grep"lo*king"demo3.txt`echo"$str"[root@linuxchapter8]#./ex8-15.shNomatterwhatyou'relookingfor,ourmottois"keepitsimple"Ifyou'relookingforaplaceorproductinaspecificlocation,【例8-15】使用星号来匹配多个字符“o”#!/bin/bash#筛选符合格式的电话号码str=`egrep"800-[[:digit:]]{3}-[[:digit:]]{4}$"demo4.txt`echo"$str"[root@linuxchapter8]#./ex8-16.shIntel:800-820-1100Abit:800-820-0323Asus:800-820-6655Sony:800-810-2228【例8-16】演示如何通过正则表达式来筛选符合指定格式的电话号码8.3.3匹配字符串的开头或者结尾
在正则表达式中,用户可以通过定位符来对字符串开头或者结尾进行匹配,定位符又称为锚点。一共有2个定位符,分别为行首定位符“^”和行尾定位符“$”。前者用来匹配文本行的开头字符,后者用来匹配文本行的结尾字符。如果行首定位符和行尾定位符一起使用,则这2个符号之间的表达式就匹配整个字符串或者文本行。如果“^”符号后面紧跟着“$”符号,即“^$”则表示一个空行。因为行首后面紧跟着行尾,行中没有任何字符。#!/bin/bash#筛选以3个数字开头的文本行str=`egrep"^[[:digit:]]{3}"demo5.txt`echo"$str"[root@linuxchapter8]#./ex8-17.sh020-8522221386754234800-820-11008008100716【例8-17】演示如何使用行首定位符筛选数据行【例8-18】演示行尾定位符的使用方法#!/bin/bash#筛选以4个数字结尾的文本行str=`egrep"[[:digit:]]{4}$"demo5.txt`echo"$str"[root@linuxchapter8]#./ex8-18.sh020-8522221386754234800-820-1100800810071698-38768.3.5子表达式所谓子表达式,是指由多个普通字符或者元字符组成的一个小的正则表达式。与正则表达式一样,子表达式本身也是一个完整的表达式,但是在使用时,子表达式是作为一个大的正则表达式的一部分来使用的,而不是单独使用。在正则表达式中,子表达式作为一个整体来看待。子表达式使用圆括号()括起来。#!/bin/bashstr=`egrep" {2}"html.txt`echo"$str"[root@linuxchapter8]#./ex8-19.sh<divclass="kd-appbar"><divid='notify-box'> ; ;<spanclass="notify">【例8-19】通过正则表达式定位所有的2个连续的HTML空格符#!/bin/bash#匹配IP地址str=`egrep"^([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}$"ip.txt`echo"$str"[root@linuxchapter8]#./ex8-20.sh202.116.3.210.0.0.1256.45.2.1【例8-20】演示通过正则表达式匹配IP地址的方法#!/bin/bash#匹配IP地址str=`egrep"^([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}$"ip.txt`echo"$str"[root@linuxchapter8]#./ex8-21.sh202.116.3.210.0.0.1【例8-21】通过正则表达式分别对IP地址的3组数字都给出明确的匹配规则8.3.6通配符Shell使用了正则表达式中的某些元字符作为其通配符,常用的有*、?、[]、{}以及^等。这些字符在Shell中的意义与在正则表达式中的意义有些区别,例如*表示匹配任意的字符,而非正则表达式中的限制其前导字符的0次或者多次重复。?表示一个字符,而非其前导字符的0次或者1次重复。[root@linuxchapter8]#ls-lex*-rwxr-xr-x 1 root root 60 Feb1501:15 ex8-10.sh-rwxr-xr-x 1 root root 52 Feb1723:53 ex8-11.sh-rwxr-xr-x 1 root 53 Feb1800:32 ex8-12.sh-rwxr-xr-x 1 root root 57 Feb1817:56 ex8-13.sh…如果用户想要列出以ex开头的当前目录中所有的文件,可以使用以下命令:如果想要列出以字符d或者e开头的文件名,则可以使用方括号将这些字符列出来,如下:[root@linuxchapter8]#ls-l[de]*-rw-r--r-- 1 root root 63 Feb1319:21 demo2.txt-rw-r--r-- 1 root root 221 Feb1800:17 demo3.txt-rw-r--r-- 1 root root 105 Feb1901:22 demo4.txt…-rwxr-xr-x 1 root root 60 Feb1501:15 ex8-10.sh-rwxr-xr-x 1 root root 52 Feb1723:53 ex8-11.sh…在某些情况下,文件名是按照字母或者数字顺序来编号的,在这种情况下,用户可以使用连字符来表示一个范围,这与正则表达式中的表达方法是一致的,如下:[root@linuxchapter8]#ls-lex8-[1-9].sh-rwxr-xr-x 1 root root 57 Feb1319:05 ex8-1.sh-rwxr-xr-x 1 root root 53 Feb1411:31 ex8-2.sh-rwxr-xr-x 1 root root 59 Feb1414:43 ex8-3.sh-rwxr-xr-x 1 root root 142 Feb1415:28 ex8-4.sh-rwxr-xr-x 1 root root 56 Feb1415:54 ex8-5.sh-rwxr-xr-x 1 root root 138 Feb1417:00 ex8-6.sh-rwxr-xr-x 1 root root 57 Feb1417:47 ex8-7.sh-rwxr-xr-x 1 root root 57 Feb1418:11 ex8-8.sh-rwxr-xr-x 1 root root 67 Feb1418:51 ex8-9.sh8.4grep命令在Shell
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 木工班班组劳务分包合同
- 仔猪购销合同协议书
- 深圳住房租赁合同书
- 办公用品采购买卖合同
- 衢州职业技术学院《搜索引擎营销》2023-2024学年第二学期期末试卷
- 山东化工职业学院《英语学科教学设计与技能训练》2023-2024学年第二学期期末试卷
- 三江学院《世界古代史(下)》2023-2024学年第二学期期末试卷
- 广东食品药品职业学院《医务社会工作》2023-2024学年第二学期期末试卷
- 西安交通大学城市学院《环境化学Ⅱ》2023-2024学年第二学期期末试卷
- 贵州财经大学《中学政治课教师技能训练》2023-2024学年第二学期期末试卷
- 2020-2024年五年高考地理真题分类汇编专题02(地球运动)+解析版
- 水文与水资源勘测基础知识单选题100道及答案解析
- 销售沙盘演练培训
- 2025年中国工程建设行业现状、发展环境及投资前景分析报告
- 《海澜之家公司绩效管理现状、问题及优化对策(7600字论文)》
- 小学四年级英语教学反思3篇
- DB1509T 0025-2024 肉牛舍设计与建筑技术规范
- 上海室内装饰施工合同示范文本2024年
- 2024版2024年《汽车文化》全套教案
- 房地产 -中建科工五大类型项目成本指标库
- 2024小红书保健品行业营销通案
评论
0/150
提交评论