00:00
今天呢,来继续学习这个文本处理工具,那今天呢,我们给大家介绍一个非常重要的技术,正则表达式啊,那在上次课呢,我们已经提前给大家预告了这个正端表达式,包括我们还有今天要学习的内容,就是脚本编程,都属于share编程里面,就是这个整个啊Li的基础里面,基础中啊,比较重要的也是比较难的两个地方,正好都在今天会涉及到啊,不过呢,呃,对于这个正则表达式,包括脚本来讲,这个需要反复的多次练习,需要时间的积累,慢慢才能学的更好,所以我们今天呢,只是让大家初步的了解这个振动表达式和脚本的使用方法啊,具体要你要真的写好了,真的学好了,这个需要大量的时间。好,那我们今天来学习正则表达式。所谓正则表达式这个技术大家并不陌生,在前面我们曾经学过一个非常相似的技术。
01:06
就是通配符,大家记得通配符吧,那么通配符是解决什么问题的,大家能想起来吗?通配符的功能是什么?哎,通配符它的功能就是匹配文件名,匹配文件名称的,用一些所谓的特殊符号啊,特殊含义的符号,比方说星啊,问号啊,中国号啊,甚至还有脱字符等等,对吧,可以来表达代表特定类型的文件,由此将来能够实现哎,阿俊提到的批量处理。啊,当然这些特殊符号呢,咱们有个专业的称呼叫元字符。那这些符号都是有特殊含义的,然后星号,问号,中号,我们这些符号不是表示符号本身是代表着特定功能。
02:04
那我们今天学习的正则表达式和这个。通配符有什么关系呢?啊,只能是相似正则表达式的功能,我们可以认为就相当于是增强版的通配符。那一句话大家可能就明白了,增强版的通配符就是比通佩符功能更强大,而且正则表达式,它用来处理的并不是文件名。它处理的是字符串。它是用来表示文本中的字符的。通配符是表示文件名里的特定符号的,是不是啊?比方说星,这个星是表示文件名里面的特任意字符串啊,那在正则表达式中,它是用来处理字符串本身的,当然这个字符串我们从哪来呀?可以是文本文件中的内容,也可以是。
03:07
命令的输出。啊,当然也可以是错误。我们都知道命令有输出结果不也是字符串的大部分,但是乱码的话就不好处理了,嗯。那还有就是标准输出,标准错误,重定向之类的这些信息都可以把一些文本的符号输出出来,那我们就可以用正则表达式来对这些字符,对这些文本信息进行进一步处理。那所以他逐步的对正则表达式有一个大概的认识以后,那我们接下来就学习正则表达式的。用法。那首先智能表达式这个技术并不是一个Linux的特有技术,是一个通用技术。不仅在Linux里,Windows里也支持,甚至各种开发语言里面也都支持。
04:05
我们后面学习的各种软件里面也都支持。那正因为如此,所以这个正则表达式是具有普及性的技术的,所以我们今天学完了以后,在好多地方都可以用。那未来在别的软件里面我们也会用。那所以大家也就不用担心了,因为这个正则表达式会跟随我们整个课程的过程。我们学五六个月,这就经常会用这种表达式。所以初期大家觉得如果这个表达还是比较难,这个没事,才刚开始嘛啊,你后面学好几个月呢,你经常用不也就熟了。所以大家这个也不用担心难度大的问题啊。那在学习正能表达式之前呢?我们有一些非常功能,所谓强大的文本处理工具,所谓的功能强大,其中有一个特特点就是它们都支持正则表达式。
05:05
当然这里面也就潜在的留留了这样的一个啊,问题就是是不是有些命令不支持这种表达式,那确实是不是所有命令都支持这种表达式,通常支持正则表达式的命令功能更为强强大,它可以利用正则表达式的这个能力。哎,来非常灵活的处理文本。我们其中在Linux中号称有文本三剑客。文本三剑客它的功能非常强,用的非常多啊,我们给它起了个友好的名称三剑客,他们都支持正则表达式。那第一个剑客,今天我们就要给大家介绍了,就是break命令。后续两个我们今天不会给大家介绍,我们慢慢的给大家在后面介绍这个所。
06:05
还有一个是SE。还有一个W这三个。一般我们都俗称为三剑客。那今天呢,我们来了解。这个grape呢,在aw都支持任何表达式,那我们先大概先了解一下grape的用法。因为稍后我们学习正则表达式,我们要知道它怎么用,需要用一些支持正则表达式的命令。所以我们先来了解grape的简单用法,Grape,它叫全局搜索正则表达式和打印相应的行,大家看所谓正能表达式就这个单词。A regular expression是吧,正则表达式,那这个正则表达式grape本身名字里就带了,所以它肯定也是支持正则表达式。
07:04
那么grape的工作逻辑呢?就是它会把你处理的文件的内容。读入一行,然后根据你写的正则表达式,它的信息进行过滤。如果发现满足它的过滤条件,它就会自动的把这行在屏幕上进行打印。如果不满足,接着就看下一行。那比方说我这个文件有三行。有三行内容,那grape呢?他在内存中会有一块空间。Grape,我们后面会写一个叫pattern的东西,叫模式,这个模式呢,我们可以理解成是个过滤条件。当我们把文件在进行处理的时候,它首先把第一行放到grape的处理内存空间中,然后根据这个pattern这个条件进行过滤。
08:08
如果满足要求好,那么在屏幕上打印出来,在我们的电脑屏幕上就把这行输出出来。那如果这一行不满足条件,这有个固定条件,不满足,不满足就算了,算了,那我们就开始读第二行,把第二行再读进来。看第二行是不是满足要求,如果满足要求,屏幕打印,接着打。但是500度要求,那就别打了,接着把第三行读进来。逐行处理,最终把所有的行一行一行的处理完。明白了吧,当然如果说一行都没有满足要求的,那这个屏幕上是不是就什么也没有,对吧,它没有满足要求。啊,如果都满足,那就都打印,如果部分满足就部分打印,这就是他的工作逻辑。那么对于派来讲呢,这个概念比较专业啊,叫模式啊,实际上呢,这个模式可以用正能表达式,不过我们现在没学正则表达式,那至少派你可以理解成就相当一个简单字符串。
09:10
那比方说我这写一个字符串,那就意味着它就会从这个文件的每一行里面去找,是不是每一行里面包含此字符串,注意只是包含。至于这个是哪个地方包含,是行前包含这个呃,尾巴包含还是中间包含,它就不管了,包含,所以我们先来体会一下的最基本用法。那我们来看,当然grape命令它这个文件名并不是必须输的。大家看这个文件名是可选项。什么意思呢?就是如果你没有写文件名,那么他将怎么办?如果没有文件名,它将从标准输入读入。明白了吧,它从标准输入来进行处理,那所以说我们可以这么来写,叫grape,比方说我们写一个什么,这个呃,ABC回车。
10:12
那你知道他要干嘛吧,是不是等我输东西,哎,等我输东西,比方说我随便输啊,哈哈,没反应,为什么你们里面没有ABC对吧?啊,那比方说它它ABC。哎,这回有了,而且带色了,他说里面有个ABC。那是不是意思是只要包含ABC就行了,当然你要是不包含ABC,那它就不大一。那这是不是就实到实现了一个挑出包含关键字的特定行过滤出来了,对不对?这就是gra的基本用法,那既然它支持标准输入,所以大家马上就聪明的想到了,我们是不是可以利用标准输入重定向来实现文件或者是某些命令输出的批量过滤啊?那比方说我们是不是可以这么搞啊?
11:09
行不行,这是不是就是拿文件来代替标准输入,实现文件重定向,对这个文件中的内容挑它的root包含的好。对吧。那事实上除了这种方法,那我们是不还可以这么玩啊?我们是不是也可以用管道啊,是不是一个道理啊?那既然支持标准输入,那我们用标准输入重立向,那管道不也是一种标准输入重定向的表现吗?所以都可以。当然了,实际上多此一举。因为人家这个命令本身就支持后面跟文件。用不着这么折腾啊,我们刚才不是没写文件名吗?现在人家语法里面是支持写文件名的,所以我们直接这么写就行了。但是这个我们并没有。
12:02
白给他演示,因为我们都知道要处理的文内容不一定来自文件呀,是不是有可能是某些命令的标准输出?对不对,所以这个是很有价值的。啊,那我们在执行命令的时候,那想对一些命令的输入结果进行过滤,那比方说我们前面学过慢,这个慢帮助里面有大量的内容,那我也想知道有些用法里面是不是带有什么和加密相关的呀之类的,那这个我们比如说和密码相关,那我就可以。但那么以前的话打开,但以后这个文件还比较大,那我要搜的话,我得这么搜,比方说我们要搜password。这里面还没包含,那说个简单的吧啊,哎,这一点点找,这是不是就太慢了,哎,我们是不是就可以这么搞。
13:01
这是不是就找到了我们想要的包含这个关键字的一些行了啊。是吧,是不是挺方便的啊,比方说我们现在想学习黑锤,我们都知道黑水命令是不是个内部命令,内部命令它是不是都集成在干帮助里。这不都在这儿吗?这个列出的帮助。应该比咱们通过help配是不是列的要更详细啊。明白了吧,所以大家将来用这个group过滤可以找到我们感兴趣的东西,你不觉得它就像百度一样吗?嗯。是吧,啊,百度搜索不就是找出特定关键字的那个那个网页吗?是不是对这个当然他搜的是文本内容啊,那这就是grape,那当然接下来我们了解了grape的基本用法以后,Grape呢,它的这个命令,它强大在于这这个模式啊,这个叫模式,这个模式呢,我们现在写的就是普通字母串,事实上呢,它是可以写中的表达式的。
14:11
那接下来咱们就来说说正能表达式了。那将来我们这就可以替换成折能表式,明白了吧?那这个热图的表达式有哪些所谓的原字符呢?我们刚才已经说了,通配符不有好多原字符吗?那么在正则表达式中也有。那么正则表达式它里面支持的通配符啊,就是原字符有很多个,它比通配符丰富了很多,所以为什么叫增强版的是吧通背符。那它的这个表示特定含义的正则表达式有很多。而且呢,从正则表达式的这个使用风格上来讲呢,又有两类,那一类呢,叫基本正则表达式。
15:01
啊叫basic,就是basic。那么还有就是扩展的正则表达式叫ere,是extended,就是扩展意思。扩展的这种表达式和基本这种表达式功能一样,写法就是稍微有些区别。写法上区别,我们先来说基本的整道表达式。这两个呢,不同的命令。他将来支持的正则表达式,有的是基本的,有的是扩展,有的都支持。所以呢,这两个你都得掌握啊,因为不同命令它用的这个正则表达式不太一样。那么正则表达式它是用来匹配字符串的,那因此在处理字符串正则表达式这种逻辑性的时候呢,是需要有背后的软件支撑的。因为这种需求。是普及性的,我们有大量的数据需要用到智能表达式,所以就有人专门开发出来了一套。
16:04
处理正则表达式软件模块。啊,当然咱们叫正则表达式引擎,引擎啊,就是发动机式的。这个引擎就说白了就是一个软件模块,你可以通过这个软件模块嵌入到你很多软件里面,将来用这个引擎带有的处处理正能表达式的功能。来满足你这个软件里面的正则表达式处理需求。那这是什么意思?这就是模块化开发的思想。就是我们有人已经做好了这个功能,有人已经把这个产品做好了,做的已经很完美了,是不是我们就没必要自己辛辛苦苦再做一套了?那就是有人做好了正能表达式的处理模块,你拿过来用就行了。那么其中有一个著名的软件模块叫PC。
17:04
PC,它是用破语言来实现的正则表达式处理的一个软件模块。PC re,它处理正能表达式功能非常强大,性能也非常好,历史也悠久了,相当成熟,所以我们后续很多软件里面要想用到正能表达式。都会引用这个PC re的模块。啊,我想大家这个思想应该是很容易理解的。你做什么事。现在实际上这个世界。很多很多事情已经做的非常好了。就看你怎么整合这些资源了。啊。不要从头到尾都自己做。尤其搞it,有一句话就是不要重复的发明轮子,别人做好的东西拿过来用,就省了你再从头去构建开发的成本啊。所以PC re呢,这个就是非常好的一个功能,拿过来用就行了。
18:04
那当然,不论是哪种。软件在处理正则表达式的时候,它又都用到了正则表达式中所谓的特殊符号。啊,这叫原字符,它代表着特定类型的字符串。那么这个原子核呢,可以分成粗略的分成四大类,分别来解决不同问题的四个类。那第一类呢,叫字符匹配类。字符匹配类的正则表达式,原字符用来表示某些特定符号。第二类,匹配次数。次数,次数,那就是说某个符号出现了多少次,我可以用正则表达式来表示。咱们写学同位符的时候,有这个表达次数的写法吗?
19:00
有吗?那比方说问号在通背弧里面有一个问号吧。问号表示一个字符,如果说某一个字符三个任意字符,那写三个问号。那我要表示100个怎么办?你是不是该哭了啊?我就准备放弃了,那你这100个我还有1000个,1万个那咋的啊,你不能让我都写吧?所以强大的正则表达式是有简单方法来表示,很多次很多次没有问题啊,不就是写个100吗?写个1000嘛,对吧,轻松表达。那再有就是未知锚定。所谓内之锚定呢,就说的就是这个。字符到底出现在什么位置啊,比方说你是出现在这个行首啊。行尾呀,还是单词的词首啊词尾啊。
20:00
这个不一样对吧,那最后还有一个非常。强大的叫分组。这个分组很强大,强大到你不能理解。嗯,比较难啊。好,那这就是我们给大家讲的关于原字符的四个分类。我们先来看第一个分类字符匹配的原字符。字符匹配的原字符有有一些和通配符一模一样。比方说。这些符号大家看起来是不是很面熟?看见没有,哎,这个肯定是,这不就是咱们学通配符里面的那些符号吗。所以在这也可以用。啊。啊。那除了这些,还有一些符号。
21:00
比方说在通配符里面表示任意的一个字符用的什么呢?用的是问号。但是在正则表达式是用点。点表示任意的一个字符,注意,这个字符不是字节。汉字也算是一个字符,听懂了吧,点表示一个字符。好,那另外。中括号,它里面可以写这些东西,这是不是跟我们以前讲的通本书一样啊?那这个中国号王啥意思?是不是王这四个字母中的任何一个?对不对,任意一个。四选一。那零到九就是零到九的某一个。A到Z,哎,当然这个地方的A到Z,它和通配符里面的A到Z是不是一个意思啊。
22:04
通配符A到Z是表示A到Z吗?是不是那个意思啊。咱们上次学过。那这里面的A到Z。它确实就是小A到小A小C。那如果你要想表示大写字母小写字母都有,你可以写成这种形式,也可以写成。这个。这是不是就是表示所有的英文字符了?那这就是正则表达式排除的写法呢,跟我们前面讲的一模一样,那么一模一样啊。那这就是字符匹配,那比方说咱们来试一试啊。
23:05
那我现在想表示。是否有三个任意字符点点点三个,那你看我这只有两个不满足要求。ABC满足要求吗?变红了?那现在问题是abcd,满足不满足,满足吗满足。因为你包含嘛,Grape的作用就是只要包含。就行了,对不对,你就达到三个要求了,对吧?呃,当然它这个红色也是很有意义的,当然那ABCDEF。他有几个红的。为什么是全红呢?因为ABC满足,后面的DF也满足。
24:08
对不对,那说明我们现在默认好像是贪婪模式。是不是找到第一个三个还不行,它这后面也有还有满足。贪婪模式是不是?那我们说过不是有一种懒惰模式,懒惰模式找到第一个就后面不找了。对不对?哎,这就是他背后的逻辑啊,当然大家说了这个group命令。带颜色他天生的吗?实际上不是,那我们现在用的是一个别名,鬼。真正的grape是不带颜色,不过呢,带颜色好啊,对于我们判断找到的字符是不是很有,要不它显示出来你都不知道哪个匹配了啊,如果说你用原始的GR,现在我们要玩这个实验,那就看不出来效果了,你说到底有还是没有,看不出来没颜色嘛,是不是?哎,这个就看的不是很清楚啊,所以这个加颜色还是很有意义的。
25:10
啊,那就是点,当然那现在我们想表示。这个。导航。我看一下这个文件啊,这个文件里面我们看到它有root这个字符串。那我现在想表示R开头,中间是任意字符,后面再跟个T这样的字符串,那么R加点T对吧?哎,找出来了,发现了吗?发现有root,是不是也有R斜杠FT。也满足要求吧,只能任意的两个字符串,只要满足要求,你看正则表达式就表达出来了,不过呢,建议大家像这种写正的表达式呢,一般我们建议大家双引号引起来或者单引号引起来啊,那这个地方是建议大家引号引起来的啊,虽然说我们在这个例子里面没事。
26:20
用别的符号可能就会有问题了。所以建议大家引号引起来,双引号也行,单引号也行。好,这是这的表达式。那是说到这,这个break命令,它可以过滤某一行里面涵盖的字母串,那事实上咱们Windows里面也可以这么搞。Windows也支持这种表达式啊,那比方说我现在想知道。我们的网络连接,这个是可以看的。那现在我想搜索特定的一些指令。我想从这个内容中搜出一些内容来。
27:02
它也支持管道,也支持类似于GR,都一样。啊,你像我这也甚至有查看进程的命令啊,叫什么task list,这就是查看我电脑上运行的程序。啊,那现在我想知道我这上面用运行没运行,比方说这个啊,这个这个VNC啊,那VNC怎么查呢?那我们可以用类似于grape的命令,不过它不叫great,叫find。STRVNC啊,是不是也找到了?这个命令跟那个gra很像啊,Findr,你就可以理解成Windows版的group。理解了吧?哎,这就是它的工作逻辑啊,所以grape正则表达式find s tr也支持能表达式。
28:03
那我们现在知道了正能表达式的第一种匹配字符,那我如果想表示所有的小写字符。小写字母,那小写字母呢,我们刚才说了,可以用A到za到Z,比方说我们后边再跟上一个。什么呢,跟上一个,呃,第二符号。然后T,我想查这样的符号,哎哎,你看现在我们找到了这些符号。这些符号它们都是一个特点,就是T前面是个任意字符,再往前是一个。也是小写字符。那么小写字符,那你像刚才说的这个这个东西是不是就不满足要求了啊呃,这个它不是一个字符,而是一个斜线,对不对斜线啊,所以它就不满足要求了。
29:10
当然,如果我们大写字母呢,我再加大写字母A到大Z,看里面有没有大写字母的,有没有大写字母。啊,这里面还没有我们确实没有满足要求的是吧?没满足要求啊好,那这是刚才我们find这个,这个用正能表达式可以表示啊,特定符号符号啊啊那也可以进行一些这个所谓的排除啊啊脱字符排除,排除呢是放在中号的。最前面,这就是排除。那排除的话呢,我们是不是就是这么做,就是除了这些符号不是A到Z对不对,那不是A到Z,那就是除了A到Z的,比方说什么其他符号呗,你看是不是就这回找出来了,斜线是不是就不属于字母就排除了。
30:09
啊,就剩下的,那这就是字符的第一种正则表达式。好。那如果说我们现在想。把这个命令中。所有。数字。数字形式的信息。显示出来像这种东西。数字点儿数字点。那这种东西要表示出来,怎么表示呢?那大家可以观察一下。它们的表示形式是什么?这是数字点数字点数字点对吧,几个点三个点啊,那前面呢,有一些是中间总共有四个数字对不对,那所以我们怎么表示这个东西怎么表示。
31:12
那我们目前来讲,我们可能会这么写零到九啊,当然当这这个零到九这个这样写只是表示一个数字对吧,那我要表示它这个地方,它最多可能会你看它有三位数了,对吧?那所以我们怎么办办呀,那就只能零到九,零到九零到九。但这样写也有问题,你这样写的话,表达的是三个数字,而没有表示两个数字,表示一个数字。所以这个就你写少了,那就俩数字,你写写写多了那就三数字,你不能表示一个数字或者两个数字或者三个数字。是不是,所以目前来讲呢,我们没有办法来表示很全,那这个出现的次数不好约定。
32:06
因此我们接下来就要表示次数了,那我们来看一下如何来表示次数。那这个次数呢,有很多。比方说有以下的这些都是和数字次数出现的次数有关,第一个叫星号,星号表示的是星号,注意它的含义跟我们以前说的星号截然不同啊,以前说的通配符里的星号什么意思,是任意字符串对吧?啊,它这个地方的星号表示的是星号前面的那个符号,信号前面要求的有一个符号,这个符号比方说我这写个A。那这个A呢,就表示A心含含义就是这个A出现了任意词。
33:00
啊,他和这个以前的星含迹完全不一样,他说的这个是星号前的这个字符出现了任一次,那出现这一次,比方说一次都没出现,一次没出现那A不就空吗。那如果出现一次,那这不是一个A吗?如果出现两次,是不是俩A?出现1万次,那不就1万个A吗?那这就是A心,它的含义理解了吗?它是表示前面的符号出现了多少次,重复了多少次。所以这个显而易见,跟我们之前讲的这个是不一样了,通配符那个形式任意字符串对不对就不一样了。好,第二个表示的是前面我们见过点点表示一个字符,所以如果我想表达以前那个星号的含义比任意字符串任意长度,那我们可以把它组合起来搞表示。点心点心就可以把哎所有的任意字符表示出来了,因为点表示一个,而且还任意的星是不是任意一个,所以俩一组合一配对成了就表示那个意思了,表示任意的字符串。
34:18
啊,长度任意好,还有就是斜杠问号,斜杠问号表示前面的字符,那前面也得跟个字符啊,比方说前面跟个X,那就表示X出现了零次或一次,零次不是就没有吗?一次不就是有一个吗?那实际上变相的就表示了可有可无,就这个意思。一个不就是有,当然你俩不也是有吗?满足不满足满足啊,所这就是它的含义,可有可无,所以如果我们想表示某个字符,有或者没有的时候,有也行,没有也行。
35:07
那这时候我们就用斜杠问号。斜杠加号表示一个以上。哎,大于等于一。啊,肯定有表示肯定有啊一次以上。那么再就是表示多少次啊,比方说我们这某个符号出现了多少次,假如X出现了十次,那简单,你把这写成十就行了。这就是出现的次数。直接把这个N替换成多少次就行了。你写十就是十次写100次写100写完了啊。那从多少次到多少次。低于多少次,大于多少次?这是不是就很简单容易理解了,哎,这就是他对应的表达方法。
36:05
啊,这是匹配次数。好,那既然这样明白了以后,那我们现在就可以来看一些例子了啊。啊,比方说eo这个呢,我们想执行这个命令。大家看这个命令它的效果是什么?这什么意思啊?这个斜杠冒号表达的什么意思?表示的是谁?可有可无,表示的是ETC可有可无,表示的这个后面的这个斜线可有可。是不是,哎,那这回是有,那没有也没关系,没有也行啊。
37:05
可有可无吗?是不是我匹配的就是那个斜线有或者没有,有眼形没有也行。对吧,大家都知道,有时候呢,我们去访问这个文件夹,你说加斜线不加斜线是不是都可以。明白了吗?那这时候呢,我们就可以用这个表达式,这种方式来进行处理,有也行,没有也行。好。好,那接下来我们这边还有其他的一些例子,这个。啊,这个是用的是这个扩展的,这个扩展的,我们扩展的先别说了,因为我们用稍后会讲这个扩展这个杠一是扩展。嗯。那这里面呢,涉及到一个问题,就是它这个有匹配正负数的问题。
38:02
这个正负数啊,我怎么表示正数和负数怎么匹配,那负数我们都知道负数的有一个特征就是以负号开头是吧,以减号啊,那所以我们那么怎么去表示这是一个有正数或者负数的。就正数负数我都需要,正的也行,负的也行,那这个要表示正数或者负数的正则表达式写法怎么写呢?那我们要这样写,大家看。嗯。啊,先把这个杠E先取消me。好,大家看我们这样写,能不能表示?正的或者负的数字。能不能表示?那这个斜杠问号我们说了,是不是就表示这个前面的横线有或者没有,然后在后面加上零到九加啥意思。
39:08
那是不是就是一个以上的数字。这不就表示正数负数了吗?啊,但是呢,我们看到你这样写。有问题,他说什么选项出错?啊,你这样写他有问题,他不认。斜杠问号,为什么?因为这个地方有一个这个你直接写横线它有问题,所以这个横线呢,它把它当成了一个什么选项的开头符,所以我们这个地方要处理这种东西,可能需要单独做一下转移。哎,我们这个地方额外需要处理一下转移,直接写表面上没错啊,哎,转移,诶这个转移怎么又不行了。
40:08
这个加号号写号,那加号前面我们这有一个写上一个斜杠,因为这个才是符合我们这样写的写法。是吧,哎,这样就可以了。那这个写法是满足要求的啊,那这样我们把这些数字就匹配出来了,当然呢,如果不是数字,你看我们能不能匹配啊,比如ABC。你看这个ABC是不是不符合,不符合要求,它不是符合这种表达是不是颜色显示出来的。对不对,所以我们用这种写法是可以实现的啊。好,我把这个替换一下啊,因为这个杠一是我们后面要讲的。这个杠E先不要写。
41:03
这样,我先把它写在前面吧。啊,这样来写。好,这样写语法是有问题,我把这个错误信息啊也给大家放在里边,这样的话大家可以对比加这些符号和不加这些符号到底有什么区别,我把这些案例都给你写在这,可对比。啊,所以有了这种写法呢,我们就可以来匹配这种所谓的错误符号啊,这个数字啊,这些都非常方便的来处理了。
42:09
好,那现在描描述了我们刚才说的出现的次数之后啊,现在咱们再来看刚才的问题,大家现在是不是就能搞定这件事了。现在我想把像这种数字的地址表示出来,大家觉得怎么去取?那这种数字都有个特点,就是三个点首先,然后四个数字对吧?那么你在正能表达式写的时候,我们应该如何来表示三个点四个数字呢?那我们说了零到九几个呀,一个到三个,而一个到三个,我们刚才说了有表示方法,是不是划括号一到三,别忘了加斜线表示范围,然后接着点,但这个点直接写行吗?点什么意思呢?在正的是一任意一个字符,所以我们这个需要怎么样转E对吧?然后呢,我们把这段诶来三次。
43:39
是不是可以了,当然这个有点笨啊,我们后面会有更好的方法,那咱们试试,我们先构建一个试子,假如说a.b.c.D这个也是不满足要求的,对吧?啊,那么1.2.3.4这个应该是满足要求。
44:18
那要求了吧,啊,当然我要是,哎,那我现在要是这个这个超了的话,这满足要求。那有一部分满足吗?对不对,嗯,但是如果是中间的超了。这满足吗?这就不满足了。人家是包含,你只要涵盖就行,是不是。那就算了,不过呢,我们刚才说了这个还是不太满意,这个地方是不是还有点问题,它超了它因为它是包含嘛,包含的话这个抄了,我这个感觉不太好,那么把我就想约定好它就这么多,不能这边再做了,那是不是就意味着我们描述的这种数字前面后面不能再跟别的数字了。
45:18
它就是一个完整的结果了啊,前面不能带数字,后面也不能带数字,甚至也不能带字母是不是,那也就是说我们要约定这个字符出现的位置了是吧?这个位置是一个单词的,哎,就是前面不能带东西,后面不能带东西。那这个字怎么表示呢?那我就开始来表示所谓的它出现的位置叫位置某病。位置锚定,它可以实现。字符出现的位置。有多种位置锚定表示方法,第一个呢叫突字符。
46:04
脱字符表示行首,记整个行的最左侧。那比方说我想表示某一个行开头,某一个字符开头,那你像在这个文件里面,我想表示以R字母开头。的行,那我们就应该怎么写呢,就是脱字符R。那托字符是行首,那R跟着,那不就是R开头了吗?找到了吧,你看这两行都是以二开头的。嗯。那么有行行首是不是就有行尾啊?那行尾呢?用Dollar来表示,大家好像这个在哪见过啊?美金看到到眼前一亮。
47:06
啊,当然这个Dollar我们学上上次课讲VM的时候,我们用Dollar表示什么意思啊。它是不是就是跳到行尾,那实际上就是这个表达式。VM也支持这种啊,只不过我们还没讲,所以当时就没强调啊。所以Dollar表示行尾,那Dollar表示行尾,那比方说我想查看这个这个这个像这种什么干结尾的行。那我们应该怎么写,哎,但是到了。到前面加个BA,那不就是BA结尾了吗?出来了。好,那在咱们的系统中呢。
48:00
有很多很多文件,比方说这些文件。这些文件呢,我发现很多都是以井号开头,那这个井号开头实际上很多啊,都是一些注释,这个注释我们是不关心的,你看这也是井号开头,井号都是描述性的东西,我不想要,那如果你不想看这些井号开头的行啊,那么有的时候。这里面携带的东西很多。嗯。我们有很多内容以什么什么开头,这个看到内容。有些我们不想看到,想过滤掉。那过滤掉的话呢,我们就可以用刚才提到的这个方法,假如说井号开头行不想要了,那我们要把它过滤掉,怎么表示啊,那这个井号的可以开多少行,这个好找吧啊或者呢,我们可以看一下,你看井号开头的行,那下面这是不是都是非井号开头的行,非井号开头行我们发现都是什么啊,这个这个字母开头,字母开头我们可以这么来表示。
49:26
那我们可以用脱字图。那井号开头。那井号开头是这么写,这井号开头怎么表示呢?那写到前面去,这是不是就是非井号?注意这里面呢,两个脱字符含义不一样啊,第一个呢,表示行首,而放在中号里的脱字符,人家表示的就是非井号,非中括号里面的任意一个符号。
50:07
当然我们这样写。把这些。非几号的行过滤。好。那在咱们的系统中确实是有不少文件的。那这些文件呢?他们存放的这个内容中确实有大量井号开头行,就会导致咱们看起来非常不方便。所以用这种方式就可以把它过滤掉。好,那接下来咱们继续。好,我把这个例子呢,给大家写在这啊,有些例子给你放在这。
51:02
当然这个例子呢,实际上在诺八上也都是可以支持的啊,这些都是一样的。啊,都一样,这个直接可查。那这里面这有一个叫杠V的选项,这个杠V的选项跟我们刚才讲的这个排除是类似的啊,这个杠V呢是grape命令的一个用法,Grape呢,它有一个杠V选项就排除的意思。Grape,排除就是不包含的意思,那如果如如果我们这么写,它表示的是。把那些不包含入行显示出来,哎,V是排除的意思。知道吧,所以我们现在如果这样写,大家看这个比例。
52:04
这是什么意思啊,脱字符加Dollar这是什么意思?哎,空行就是有些文件里面会大有大量的空行会占比较多的空间,那如果我们把这些空行弦给它去掉,那我们就可以用这种方法来实现啊,比方说我们现在可以拿这个文件来说ETC这个这个。RC,看这里面有没有什么其他的文件。RC啊,就拿这个文件吧,啊,这里面你看有一些是空行,有一些是空行,那空行呢,会占比较多的空间,那我就可以用这个方法把这个空行给它过滤掉,这个脱字符加Dollar。
53:04
连起来是不是就是完全的空行了,就什么也没有吗?啊,那我们用这种方式就给它过滤掉。但是事实上我们除了用这种方法,我们用刚才那个写法行不行,这样写行不行,这样行吗?这这这这样写行不行?这行吗,这个。看这个写法,看见没?是不是也实现了排除了我们的空行啊,这什么意思,这个是就是不是这行首呢?你看这不是行首吗?这行首行首后面跟的这个符号不能是行尾吗。
54:00
那如果是行尾,那不就是空行了吗?是不是,所以我们用这个方法也是可以实现啊,我这个例子里面用的是P啊p p pro profile是吧,那我们看一下这个profile文件啊。文件,那文件里确实是有大量的空行的,你可以看一眼。啊啊,所以我们就可以用刚才这样写法,可以过滤掉这些所谓的空行。过了。这个可以做到啊,当然这样呢,进一步的又把什么井号开头的好像又过滤掉了。啊,当然,如果我们把这两个合在一起写行不行?
55:04
我这样写是不是不仅把空行过滤掉了,井号开头的行也过滤掉了,成不成啊?你看成了吗?啊。成了没有,明明是可以的嘛,所以我们用这种方法是不是更加简洁了,这个方法可以啊,但是显而易见,下面的方法更加简洁。你们可以用别的方法吗?用的是什么?斜杠还没斜杠熟悉哪啊,你这竖线没打出来。
56:07
我们还没学竖线呢,那目前我们学到的技术,用这个就可搞定。对吧,而且这个还挺简洁。啊,你加上数前不是我这个写在是吧,那现在大家明白了吧。哎,那这就是表示行首。行尾。除此之外,它还可以表示单词的词首和单词的词尾,单词的词首和词尾。我们这么来表示。这个。小小括号前面有个斜线,这个表示单词的词首,单词的词尾,那比方说如果我想表示以ABC开头的这个。
57:18
呃,单词,那这时候呢,我们就可以加上一个呃,斜杠小于号,然后后面跟上一个ABC就可以了。好,那比方说我们现在来试一试啊,这是ABC,这是一个完整的单词。我想表示是这个单词是个完整的,前后不带东西。如果我们前面有内容,右边内有内容,你直接break,它只是包含,我要保证ABC是个单词,那我所以我们这个地方要表示它前后不能带其他的数字字符了,其他符号了,那这时候我们用。
58:14
这个表示的是ABC必须处于整个单词的词守,所以这个就不满足要求了,哎,但是这样的话就满足要求。是不是当然,那请问大家。这个不满足要求。这个我们。这个是ABC开头的单词吗?是不是明明是。什么意思?因为横线不属于单次范畴。横线它不属于单词的范畴,当然那你明白了吗?这是不是也不属于单词范畴啊,当然这个需要加引号引起来啊,要不他这个会出问题。
59:06
那那什么算单词范畴呢?下划线算不算单词范畴?范畴单词,字母,数字,这都算单词的范围就是。单词什么算单词里面的成员?组成单词的就是数字字母下划线。那也就意味着,如果你要表示以ABC开头,那就意味着ABC的前面不能带数字,不能带字母,不能带下划线。其他符号都行,因为它不属于单词了。听懂了吧?对,你们总结了吧,啥是单词?数字字母下划线组起来的就算单词,除此之外呢,不算单词。啊。我看大家小本本也不记,是不是你们真的能过目过忘啊,我今天讲完了,你马上就记住了,这个东西在我写的笔记里没说啊,我这不一定都是100%都有的,有的时候上课就给你补充了,这里面没说没说,你们自己下来看啊。
60:15
嗯。算了,你写了吗?啊,什么叫单词啊?单词的组成单词是由啊,字母,数字和下划线。就成就行了吧,你们要懒得写,我写吧。看我多贴心呢,是吧?好,那这是刚才我们提到的。啊,那词首也是一个道理啊,词首词尾都是一个道理,都是用这种写法啊,所以我现在要表示一个单词明白了,那现在我们以前没搞定的事,现在可以再来搞了。
61:09
就是我想表示这个数字前后不能带别的数字了,也不能带别的符号,那不就是表示什么单词的词首词尾。是吧,那那这个怎么表示啊。那写吧,再写一遍,刚才我们写过了,已经写了一部分,那再完善一下。啊,这样我们就组合一下得了啊,1.2.3.4,这个先是拿这个先满足一下,那刚才我们怎么写来着,表示数字是吧,零到九啊几个呀,一个到三个之间是不是啊,然后还有个点,这不就表示了数字点吗?然后这是不是这部分要出错出现三次。
62:02
两次三次,第四次的时候,这个最后就没有点了。是不是,哎,这样就表达出来了啊,当然我们现在刚才说了,中间超了不行,这不满足,但是前面超了,后面超了他是允许的,那你看你前面超了他允许,所以我们现在要限定了,那咋限定啊,刚说过了啊。单词词首,最后这个是还有单词词尾,单词尾呢就是二号。啊,不满足要求。哎,不满足要求满足了。对吧?啊,如果你这个词尾不加,比方说我们这儿注意这边抄了,这边抄是可以的,所以你不截住它,它就可以抄。
63:00
是不是这个道理啊,明白了吧,就是这个位置锚定就可以限定住你出现的位置。啊,当然这个地方请问大家,对于我这个例子来讲,我用单词词首词尾,我用这个这个呃,行首行尾行不啊,不用行首行尾行。行首行位不行吗?咋不行啊,这里面就行嘛,明明就是一行吗,咋不行啊,我说这个,我说现在这种情况,这个是可以的,但是if他是不行,那这里面那不是一个单词这个句子的行首行是吧?哎,所以在这里面我们就不能用了,那这里面我们就得用刚才写的这个为什么锚定错。嗯,在在在这在这在这看OK了吧。
64:08
对吧。好,那数字我们就知道,包括地址怎么表达。那将来这些东西呢,将来我们尤其写脚本啊,这个是很有意义的啊。那写脚本的时候呢,有的时候我们要配置一些什么ID地址之类的,我怎么知道这是个合法的IP啊。对吧,我就可以用这种方式来判断。那你满足满足这个正则表达式的要求啊,不是合法IP,我让你重新写提示你报错,说这个输入的IP地址不合法,请你重新输入是不是,哎,这个咱们就有目就有方法了。第十项。当然,目前来讲,我们这种写法还是有点笨拙的啊。
65:03
啊,这个考考虑好几次啊,不是很方便,咱们后面会有更好的简单的写法啊,这是位置位置锚定的问题,知道了。那接下来还有就是分组的问题了。分组这个是相对比较。复杂的,所谓分组呢,就是把多个字符组合在一起。有点像我们。小时候学的那个小括号。小号是不是它优先级特别高?比方说我们想把某一个优先级低的。计算公式,先优先计算小括括起来对吧?哎,那么这个分组呢,就是这个作用,它可以把一些原来是独立的给它放在一起,整合在一起,小括号过去,当然我们这个地方小括号需要加斜线。
66:02
那例如我们前面曾经给大家说到的这个符号。我想表示一个符号出现了好几次。比方说我这儿有一个这样的文件,谷歌。五个是吧,五个。啊,大家看这样的一个字符串。就是各种O啊,那现在我想搜索出。包含两个。以上的骨骼。
67:03
两个O以上都行,两个O一个O一个不行,至少两个O,至少两个O,那这个怎么表示?我要表示两个欧以上。G开头,GRE中间俩O以上。表示两以上咋表示?写一个O,然后再写一个。啊,那反正是方法是多样的,那O表达两个以上,那两个意思上不是说过了吗?这不是二吗,二逗号这不就俩以上吗。嗯。这不刚讲完的吗?啊,同学们,你们在思考人生吗?
68:09
是吧,然后G这不就聊就行。当然有同学也说了,我也不用这种方法行不行,我换一个方法也行啊,怎么写啊一个然后。再来个O,比如说一个以上。这是不是也行啊?因为这个斜杠加表示一个以上,那前面已经有个了一个以上,那不就俩O加起来不就俩O以上啊,所以这个同学这样说也没问题啊。那我用心行不行,这行不行,这可以不,这对不对,对吗?明明是不对的,你怎么找出一个O来也满足要求了,为什么?因为心表示可有,可就是认一个,认一个的话可能是没有。
69:27
那这个可以没有O,那是不是就一个O了,所以我要确保至少俩O,那怎么办,再补个O。Ocean。那这个是不是就肯定是两个异常,所以方法是多样的。大家明白了吧,好,我把这些案例呢给你写在这啊。嗯。
70:14
好理解吧,理解你现在好理解了是吧,当初原来学的时候,这个咱们助教老师也是也是看不明白,跟大家一样啊,可能有些同学现在可能还学的不错啊,这个初学的同学会觉得懵懵的啊,这么多符号我记不住啊。说实在也不太多啊,就这几个,慢慢用的多了就记住好,那刚才我们用的这个写法呢,都是表示这个一个符号出现了这个这个多少次啊,脑袋瓜的嗡嗡的是吧,嗯。
71:24
这个难度不大啊,相对来说,因为还有难度更大,你们越学东西越多,等你们学上十天以后,你翻过来看今天内容就觉得简单,因为难度更大的在后面,好,那接下来还有分组。
72:01
分组说的是什么意思呢?就是把多个字符组合在一起用,而不是一单一一个字,我们现在都是一个字符,比如一个字符出现了十次,哎,但是我要表示一个单词出现了十次怎么办呀,对吧?那这个时候我们就要用到分组了,所谓分组就是把这个单词括起来。哎,成了个整体,然后再给它出个多少次不就完了,那单词括起来分组怎么表示呢?那就是用括号括起来就行,它就简单,比方说我们想表示ABC是个单词,那括起来就完了,不过呢,别忘了加斜线啊,这个斜线总得加这个加上就行了,然后我们现在比方说我想表示ABC出现了。三次,那这时候我们就可以用这个这种写法就break。这个是分组了,分组完之后我要表示三次三次,这就是ABC出现三次了啊,当然两次是不行的,因为我这要求必须三次。
73:17
明白了吧,这不就分组吗?但是分组只是用这种方式把一个单把若干个字符串起来,组合成一个完整的整体,这是分组的第一个用法。还有更为强大的用法就在于它还可以支持后项引用。这个后项引用这个技术呢,是相当有意义的一个使用特性,所谓后项引用,说的就是它可以把前面分组表达的字符在后续再次重复使用。
74:11
比方说我想表示的是这个意思,就是前面是ABC,后面再次出现了ABC。我想表示就是前面有ABC出现了,后面还有ABC出现了。再次出现了ABC,那以前的话咱们很多人都怎么写啊。比方说ABC不就出来了吗?那出来了,那我就写上ABC,后面啥呢?点心任意字符串,哎,又出了个ABC点星可以吧,这不就可以了吗?啊这样,但是你这个ABC个固定的,你这个ABC是个固定的ABC,但是我们将来它不一定是固定的ABC。
75:08
有可能,比方说我想表示的是。某些正则表达式匹配的字符。比方说,我们想表示的是。某些文件,比如说JPG文件。JPG是图片。那么我希望只要是这种GPG的。图片后面再次出现的时候是A点,比方说是这个这个换一个P。但是他们的前缀是一样的。前面都是A,这也是A,如果前面是B,后面还是B,前面是C,后面就是C。
76:00
这个东西咋表示。这就活了呀。它不是个固定的。那实际上现在就是你要表示出什么,JPG前面是一个某一个字符。可能是A,可能是B,可能是C,可能是什么什么别的。那这个怎么表示,那这个时候我们就可以用点心任意的嘛,啊,当然这个点呢,表示的是就是点是不是就GPG了啊,然后后面再次出现了。那后面再次出现了,前面是这个这个c.GPG后面就是c.PG那是不是这个东西再次出现了,但是它过率不一样,那这个怎么表示。你怎么表示后面出现的和这是一样的呢?
77:05
哎,这个地方我们没有办法,因为你不知道前面是什么,你没法写,前面是A,后面就是A,前面是B,后面就是B,那你没法写,你也不知道是什么,所以这时候我们就要用到分组了,怎么分组呢?就是用括号括起来,把它先括起来再说,这时候括起来以后,我们想表示后面出现的字符和前面括起来的东西一模一样,那就是后项引用。斜杠一表示的就是第一个小括号括起来,因为我们可以有好几个小括号。再加上一个斜杠,点PNG,这就可以了。这什么意思呢?就是说这个JPG前面的是什么,后面就是PG,前面就是什么,前面是a.GPG后面就是a.PG前面是c.GPG后面就是c.PG理解了吗?
78:00
后向引用有点像变量的重复使用,前面出现了个S后,后面我再调这个X,就这个意思。只不过求它这个写法比较比较,这个看起来不太好看,当然这个一呢表示的是第一个分组,因为我们后面还可以跟多个分组啊,比方说我们这这还可以再来一个分组,我还可以多跟多个分组,我这还可以跟多个。那这个时候,如果我们想在引用第二个分组的时候,你写个二,因为俩小括号,那同样斜杠三斜杠四,那前面有几个小括号,后面就分别引用它就行了。那这个东西啊,确实不太容易理解,那么后项引用这个技术最常用的应用场景就是搜索替代它去搜索替代的时候,比方说我们要搜某个字符,把它替换成一个别的字符,但替换的时候不是说这个原来直接把它替换完了就完了,那是我们替换的时候还要保留它的一部分内容,比方说原来是ABC,现在我要替换成什么ABC123假设。
79:19
我这个ABC还留着,问题是我还不是说全要全不要了,全不要了,那好说那一替换就完了,但是问题我还是想留着它。那这时候我怎么表示前面这个搜出的东西后面还留着呢,就是斜杠一啊,举个例子啊,那比方说我们就拿这个文件来说啊,别拿这个文件了,这个文件拷出来吧,拿这个文件来说,大家看这个文件里面是不是有root,我现在想把root替换成root。把root替换成root,实际上这个好替换,我们直接这么写就行了,全文搜索杠s root替换成U。
80:07
是不是就可以了,如果贪婪模式加个G。对不对?但是问题是我并不想这么干,我想搜索的是R点点T。这种字符串替换成后面是啥,你前面啥就是啥,变成一样。就我也不知道前面是R,中间是啥东西啊,我也不知道。我想替换成原来啥样就啥样,不后面补个一,那当然我们这里面呢,我们看到刚才曾经有一个叫R斜杠FT的对不对,这是不是也是满足要求的,那么这个R斜杠FT它也是FR点点T的切分组合,那我就想在像这个R点点T这种整段标它是匹配的情况下,后面补个一二,那这时候由于这个符号它是不是确定的,我们就写点点呗,那替换的话的话,如果我们这样写是不行的,你要这样写成了什么了,那就是你把R点点T替换成了。
81:12
那后面写的R点零这个点就不是这么表达意思,就是点的意思,如果你这么写,你看着啊,它替换成,你能想象它替换成啥样。R,那是不是就变成了R点点T,这个地方也变成了R点点T啊,你看一下我们执行一下看看效果。能看出来吧,就是这个样子了啊,我这个不是我们想象的,我觉得我们想前面是什么,后面还留着什么,在这里补个一二已,对不对,所以这时候我们就用刚才说的这个分组啊,怎么分组呢,括号括起来。括号括起来,别忘了加斜线,后向引用,后向引用。因为我现在只有一个分组,所以斜杠一就好了,好再看。
82:05
成了吗?看明白了吗?看我咋写的,这里面需要大家深刻的理解,就是我们这这个正则表达式一定是最终匹配下来的最终结果,用最终结果。来进行替换,而不是替换正则表达式本身的含义。这句话比较绕啊,就是我们这R点点T,它确实就能表达,但是我们最终匹配的是它的结果,比方说R斜杠MT,这不就点结果吗?那替换的时候你这是R斜杠MT,那么最终替换完了还是RMT,你不能说你这是R斜杠MT变成rot了,这不行。虽然它们都符合R加点T这个正则表达式要求。
83:03
他匹配来的是最终结果。而不是正则表达式本身。啊,那这就是这样的一个作用,那这个呢,将来我们尤其在处理一些文件的时候呢,用的非常多啊,比方说呃,我们这样啊,我们会有一些这样的文件,比方说A点MP3什么啊,B点这个这个MP啊这个音乐音乐有有什么avi是吧。是吧,就是一应该是电影的那个视频吧,这个声音有什么后缀的,除了MP3声音的,那那就不知道什么后缀了,MP4是视频了,因为ay是声音吗?还是视频呢,视频是吧?啊,那我们就随便写一个吧,哎,我记得好像是这个这个M什么PGP还是什么什么,是不是有这样的后缀啊,那如果是这种后缀的文件,我们就给他替换一下。
84:24
啊,替换成只要是这种后缀的MP4啊,这个我们就知道就行了啊,就关MP3吧,如果是MP3我们就给它变成一个别的指定的这个后缀啊后缀后缀什么呢?替换成,比方说啊替换成。MP4吧,就是MP4,那这时候我们可以这么来做,就是百分号搜索先把它写上啊,我们前面是什么,它就保留什么。
85:06
所以我们就要,诶这个斜杠前面是什么?前面是点心,后面是MP3,斜杠替换成什么呢?切换成它保留原来的意思,替换成MP4。看懂了吗?这是不是就是前面的名保留下来了,就是后缀的MP3给替换了,替换成了MP4了。有谁写错了,呃,少了一个斜杠是吧,少了一个斜杠这个这个咱们VM呢,看来用的是正基本的正的表达式是吧,哎,斜杠走。怎么替换了不对呀,看来模式吗啊,MP3点MP3,然后替换成斜杠一。
86:14
MP4。这个不用转啊,这个是替换完了的结果,搜索斜杠点星是任意字符串。然后括起来,然后这是个分组,分组完了以后呢,后面跟点MP3来替换完了,但是他替换的是第一个那个,我知道他是往下搜索,那我们来看一下啊。要把它全恢复,然后再写一遍,看看他能不能替换了,哎,替换的是最后一个是吧,最后一个。
87:14
但是我这个第一个没替换,再替换,第二个再替换第三个一个一个替换啊,那我这一行里面都带,那我们就把它分开写,因为是这样的,确实是这样的,因为我们这个写的它这个本身它是搜索一行里边要写,它不是说这个都是。我先把它还原了啊,也是各行一行,我这个搜索是搜索一行里东西吧,啊,我没有搜索这个整个的内容,那我们这样写,我这样写,把它放在好几行里面看看,放在好几行里面,我们去搜整个文件中MP3搜索替换成MP4看一看,哎,这回可以了,对你这个VM他去搜索,它是搜索一行银行在处理的。
88:15
当然我们这个加了一个杠G啊,应该是对吧,加杠G的话,这中间有什么问题吗。哦,我知道它这个搜索的时候,它是从左到右开始搜,找到以后,它这个找到以后,找到以后匹配了,匹配了他就替换了,替换了后面他就不看了,应该只处理一个,因为这个地方呢,我们这样写只是匹配了其中第一个,第一个后面他就不不看了。啊,这样的一个意思,好,那我们刚才看到了用这种搜索,那事实上咱们在未来将来学习别的软件的时候呢,也会用到很多类似的地方,比如说我们找一个啊,我们后面会学习的什么NGX这样的软件,NGX这个软件里面,它就有一些这个正则表达式的用法,啊这边呢,有一个这样的一个语句,语句块,它应该是right吧。
89:35
嗯。
90:00
好,再看这段代码,这个代码就是一个正的表式的写法,大家现在看啊,有些符号和我们刚才讲的略微有些区别。哎,大家看这个小括号,你看是不是就是分组了,不过他没有加斜线啊,没有加斜线这就是分组啊,你看这是两个分组。这是一个分组,这是一个分组啊,那你看这这个地方它没有加斜线,没有加斜线,没有加斜线,这个就相当于我们刚才说的斜杠一啊斜杠一,这个斜杠一到一什么意思,是不是就是第一个分组,而这个地方是不是有个刀二,这不就是第二个分子吗。所以大家看这个命令的作用就是把这一串怎么样呢?搜索替换啊,替换成啥呢?替换成到一留下来,那就是download烙的点星,原来啥样还留下来,但是这个media呢给替换了,替换成了MP3,它就没了,然后后面这一串呢,是不是留下来了,哎后面还是到了后面呢,是任意字符串是不是变成了P3。
91:22
你说吧。那所以他现在就用这种方式实现了一个搜索替代啊搜索替代。理解了吧,所以尤其在搜索替代这个用的非常的多,非常多。对,刚才这个,因为我现在看到了这个子清刚才也提到了,像这个点心呢,是个贪婪模式,贪婪模式的话,是不是他就把所有的东西全给你匹配完了。就从左到右,因为它是贪婪模式啊,刚才我们这么这么写,现在应该是这么来的意思的,这个意思就是他贪婪模式以后,哎,从A。
92:02
它是贪婪模式,一直找到最后的MP3,那么这就意味着我们这样写的话,你这个点心实际上匹配到的是这个位置。全匹配啊。贪婪模式,贪婪模式那就意味着点心,那我们刚才怎么写的,我们是不是写的是点心,点心这意字符串,点心这一串,按理来讲到这儿我们希望就结束,但是呢,贪的模式,贪的模式一传达到这儿来。也就是说,他把这串给当成点心了。所以他就只替代了把这串,把它当成点心替换成把这个变成MP4了,所以这个就前面就没替代,因为它的模型。是吧,哎,贪婪模式按概理来讲,我们这有个G应该是能够做比价值,但是没想到它是个贪婪模式,它的模式的话,它来到这,它这个点心匹到这个位置了,他把它作为一个整体了,就所以我们这样一做,哎,它只替代了第一个,只替代第一个。
93:07
啊好,所以这就是咱们刚才给大家讲的分组啊,分组和所谓的这个互相引用,这个用的是非常多的啊,非常多的,那现在大家可以思考一下这个问题啊,正好大家可以改一下了。直线大家看这个命令,这个命令呢,和我显示的结果你们是不一样的,应该。你们的网卡就是网卡的名称,我这个网卡名称是E至零,你们的网卡名称应该叫什么ens,什么三三什么之类的,那这个名称怎么改成和我一样呢?那就是把这个文件改了啊,我们这边有一个这样的文件,把这个文件改了其中这个地方。
94:01
我我这已经加了一个了,你们没加就在这行。建行找到以后把这个改了,把这个加上就行了,但是加的时候我要求大家不是直接手工加,哎,咱们用搜索替代加,搜索替代最终的目标就是用搜索替代能够在这个位置加上一个net I内点零。怎么做用搜索替代实现啊,用搜索替代实现不是手工敲啊,手工敲那就没啥意思了,练不出来了,那我们要因为我们写成搜索替代以后,未来是可以把它写成脚本。啊,就不用每次手工写了,你要是说改一台机器你这么改可以,那改100机器呢,改1000台机器你也这么改啊,对不对,那必须要通过一些自动化手段,所以搜索替代就是个典型的方法,那怎么做呀?
95:02
大家说吧,你们自己写,写出来打在那个腾讯课堂里面,我看谁写出来了。用搜索替代,我刚讲了VM搜索替代。是吧,当然你要定位你你写的时候一定是改成这一行啊,在这一行的最后,最后这个地方C入一个注意啊,这个地方它原来双引号在哪,原来双引号是在这个位置是吧?是在这个位置吧,现在在双引号的前面。塞了个这东西进去,这中间塞这个东西有点小技巧,怎么塞?这不是手工塞,是用搜索替代给他塞进去。大家琢磨琢磨。
96:14
那咱们刚刚学过VM的搜索替代,怎么表示这一行的搜索替代,因为别的行不搜索啊,只替代这一行,在前面我们刚刚学过VM的使用VM的搜索替代呢,它里面是有定义搜索具体哪一行的?那在VM使用中,我们曾经给大家说过,那它这个搜索替代呢,前面可以标识行,怎么标识行啊,这边有一个pattern模式,看到没?这个就是表示满足这个pattern的行,那所以我们把这个搜索的行写在这个两个斜线中间就可以了,那怎么做呢?那就是。
97:00
谢姐,搜索什么呢?这个行和别人不一样的地方是不是就是它是以这个开头,以什么开头那脱字符呗,这不是正的表达式吗?是不就找到这行了,对吧?当然不相信的话,咱们可以试一试,假如说把这行删了,加个D是不是就删了,删了你看是不是真的。对吧,说明我们的写法是没问题的啊好,那现在当然我们读的目标不是山,是要把里面的东西给剃了。T是什么呢?就是T在这个位置,给它在最后一个双引号的前面塞入一个新的字符串。那怎么搜索替代搜索,这回我们不用那个那个斜杠了啊,我们用晶晶井得了是不是也可以啊,这个分割符用什么都行吗?那怎么表示呢。哎呀,这个搜索这个正则表达式分组好在哪呢?就是。
98:00
你把它分成好几块,大写八块都行啊,咋做呢,比如说。我们可以点心,点心是不是任意字符串。它会匹配所有,但是我们一定要匹配到哪啊,匹配到双引号之前啊,双引号之前,那我们就可以这么写。双引号呢,是处在整个行的最后,我们加个Dollar确定一下。这是不是就把这行就表达出来了。看懂了吗?哎,然后要替换成啥呀,替换成原来东西留着呀,是不是这串都留着呀,留着。
99:00
你怎么加了这东西?好,那么是这样。我们要留着它替换成什么呢?替换成。是不少了一个井号,少了这怎么这这是这是啥东西。我先退出来啊。好,在这儿我们要替换成什么呢?替换成斜杠一留着。是不是先万一留着?斜杆一留着,然后后面补上刚才说的net,角if names等于零。
100:05
最后这个双引号还是留着吧。是不是这意思,这不就行了吗?那大家看啊,这个是任意字符串加双引号结束,然后被我替换成斜杠一,斜杠一不就是原来的东西吗?原来东西是不是就是一直到双引号之前内容全留下来了,原来以后在后面补一个net空格,Net f1名,再加个双引号不就完了吗?走,看看成不成啊。看到没,是不是真的又补了一个,你看我这又加了一个。那你执行这个命令,不就相当于加了一个吗?当然这种写法呢,我们还可以更简单一点,怎么再写一个?啊,我们还可以这么写。啊,还是把刚才那个出字符写上,我要表示替换的这一行。
101:06
替换这一行。搜索。最后换一个解二。替换成啥呢?替换成点心双引号。这是我们目前的这个符号。对吧,哎,那事实上我们是不是也可以更透了。我们发现这个双引号不就是最后这个双引号吗?所以我们可以把它表示一下。双引号Dollar双引号Dollar不就是最后一个双双引号了吗?那替换成啥呢?那替换成ne if Li等于零双引号不就行了,就连分组都用不上了。是不是大家明白了吗?那我们来试一下啊,走,你看是不是又多了一个。
102:03
Net点。理解了吧?啊。那这就是添加的方法啊,知道怎么加了吧,加完以后再执行一下这个命令,再执行一下这个命令GRAB2MAKE,看外边杠O执行一下这个命令,你把这个命令再执行一遍,就是刚才那个东西改完了啊,改完了再执行一下,执完以后把电脑重启。你就看到网卡名就改了。以后大家都改了,提前就改了得了。这个是我们相当于初始化的其中另外一个要做的事,这边要求大家有一些是初始化的事儿,我们累积累积啊呃,这是装包初始化的一些操作,装包,那接下来这个是修改网卡名。
103:12
网卡啊,在网卡在这儿把这行给了。好,这样的话呢,大家现在就应该慢慢的就是和这个环境的要求一致了,那这个未来呢,将来你们肯定会涉及到一个初始化环境,就是在生产中,也是我们装好一个系统以后,并不是说原互动的啊,肯定是将来要做一些初始化的啊,不是说装好系统就能满足生产需要的,而这些呢,都要来做了。好了,这就是咱们给大家讲的正则表达式这一部分。相信大家。
104:02
能听懂是吧?啊,我没有说要求你背下来啊,我知道你记不住,当然也许有些同学记住啊,这个班里有同学聪明。啊,但是大部分同学可能不一定能记得住,没关系啊,记不住正常记不住,我们因为后面会反复用那正则表达式,我们已经给大家介绍完了,那稍后呢,还有扩展的正多表达式的写法,这个我们缓一缓啊,待会再说休息会。
我来说两句