1. 定义正则表达式
正则表达式是你所定义的模式模板(pattern template),Linux工具可以用它来过滤文本。Linux工具(比如sed编辑器或gawk程序)能够在处理数据时使用正则表达式对数据进行模式匹配。如果数据匹配模式,它就会被接受并进一步处理;如果数据不匹配模式,它就会被滤掉。
例如:星号通配符允许你只列出满足特定条件的文件
![](https://i-blog.csdnimg.cn/blog_migrate/1dfaf5a29ce2653f75e01465d383c238.png)
正则表达式的类型
Linux中的不同应用程序可能会用不同类型的正则表达式。这其中包括编程语言(Java、Perl和Python)、Linux实用工具(比 如sed编辑器、gawk程序和grep工具)以及主流应用(比如MySQL和PostgreSQL数据库服务器)。
在Linux中,有两种流行的正则表达式引擎:
1) POSIX基础正则表达式(basic regular expression,BRE)引擎
2) POSIX扩展正则表达式(extended regular expression,ERE)引擎
sed编辑器只符合了BRE引擎规范的子集,gawk程序用ERE引擎来处理它的正则表达式模式。
2. 定义BRE模式
2.1 纯文本
原则1:正则表达式模式都区分大小写。
![](https://i-blog.csdnimg.cn/blog_migrate/4b5788798dadb66074912dd1e7f29a12.png)
正则表达式中使用空格和数字
![](https://i-blog.csdnimg.cn/blog_migrate/b5102a9baad208f496ec63944860bc6c.png)
匹配多个连续空格的正则表达式:
![](https://i-blog.csdnimg.cn/blog_migrate/41d60c3347c19fcd8cc5162043aff7d9.png)
2.2 特殊字符
正则表达式可以识别以下特殊字符:
. * [ ] ^ $ { } \ + ? | ( )
如果要用某个特殊字符作为文本字符,就必须使用反斜线\进行转义。反斜线本身也是特殊字符,要在正则表达式中使用它就必须对它转义,这样就会有2个反斜线。
虽然正斜线不是正则表达式的特殊字符,但要使用正斜线也要进行转义。
![](https://i-blog.csdnimg.cn/blog_migrate/b703159bcd64c37e13a6ca196aa1452f.png)
2.3 锚字符
默认情况下,当指定一个正则表达式模式时,只要模式出现在数据流中的任何地方,它就能匹配。有两个特殊字符可以用来将模式锁定在数据流中的行首或行尾。
锁定在行首
脱字符(^)定义从数据流中文本行的行首开始的模式,即要用脱字符,就必须将它放在正则表达式中指定的模式前面。
![](https://i-blog.csdnimg.cn/blog_migrate/fc6afffd3e3ba28920840645fe526bdb.png)
由于脱字符出现在正则表达式模式的尾部,sed编辑器会将它当作普通字符来匹配。
![](https://i-blog.csdnimg.cn/blog_migrate/44d4a06a5b69e4ba3055b9a5281bb8e1.png)
锁定在行尾
使用特殊字符美元符号$ 定义行尾锚点,放在文本模式之后指明数据行必须以该文本模式结尾。
![](https://i-blog.csdnimg.cn/blog_migrate/05a561ad595369cb6b25717f3c0400ba.png)
组合锚点
可以在同一行中将行首锚点和行尾锚点组合在一起使用。
![](https://i-blog.csdnimg.cn/blog_migrate/9ca1493f0574674cfbd71ebbe016d814.png)
过滤数据流中的空白行:
![](https://i-blog.csdnimg.cn/blog_migrate/5c1301d82f4a04fd317a1d3c67e17c9b.png)
2.4 点号字符
特殊字符点号用来匹配除换行符之外的任意单个字符。它必须匹配一个字符,如果在点号字 符的位置没有字符,那么模式就不成立。
![](https://i-blog.csdnimg.cn/blog_migrate/d4eb1ff536589152aba6fcf6e0e9d4a0.png)
2.5 字符组
字符组:限定待匹配的具体字符。使用方括号来定义一个字符组。
![](https://i-blog.csdnimg.cn/blog_migrate/8dfdcef4560da19773508704ee221a62.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a4a9fddf1e6df33f915b4b911798f467.png)
单个表达式中用多个字符组。
![](https://i-blog.csdnimg.cn/blog_migrate/bc3151cef6f4d2ccc104ab8cdcc7ae2d.png)
字符组中使用数字:
![](https://i-blog.csdnimg.cn/blog_migrate/6bcbdc0647501818f0d7ad0f4cfae4ac.png)
匹配邮编出错的示例:
![](https://i-blog.csdnimg.cn/blog_migrate/75c3c4cb026711bb20e689298dcaae76.png)
如果要确保只匹配五位数,就必须将匹配的字符和其他字符分开,要么用空格,要么指明行首和行尾。
![](https://i-blog.csdnimg.cn/blog_migrate/bc4916ee753edfebcc1e904f783fd8ed.png)
字符组最常用的用法是解析拼错的单词:
![](https://i-blog.csdnimg.cn/blog_migrate/b7d7ead73233784332e1d51a652ea35a.png)
2.6 排除型字符组
查找字符组中没有的字符,可以在字符组的开头加个脱字符^。
![](https://i-blog.csdnimg.cn/blog_migrate/551388dd7ea564461f3d092a741bdf38.png)
2.7 区间
单破折线符号在字符组中表示字符区间,只需要指定区间的第一个字符、单破折线以及区间的最后一个字符就可以了。
![](https://i-blog.csdnimg.cn/blog_migrate/96e00b0721ab9665e8ec307cd23a9ee3.png)
若区间中含有字母,字母出现在数据中的任何位置,该模式都不成立。
![](https://i-blog.csdnimg.cn/blog_migrate/551600636034b8ce0ba8fd675ed32a21.png)
单个字符组指定多个不连续的区间:如下面的例子中允许区间a-c、h-m中的字母出现在at文本前,但不允许出现d-g的字母。
![](https://i-blog.csdnimg.cn/blog_migrate/7dd3f2d265d49071a1a40dd1bce91e7c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cebe209174905beeb0fba103667c5ef9.png)
2.8 特殊的字符组
![](https://i-blog.csdnimg.cn/blog_migrate/dd6003603ed8cddd71fbad4ac341e626.png)
2.9 星号
在字符后面放置星号表明该字符必须在匹配模式的文本中出现0次或多次。
![](https://i-blog.csdnimg.cn/blog_migrate/23fb3b0193ad47ec771d037a01fdb127.png)
在可能出现的额外字母后面放个星号将允许接受拼错的单词。
![](https://i-blog.csdnimg.cn/blog_migrate/69283ce47954d080a802a35d15be3999.png)
字符组+星号示例:
![](https://i-blog.csdnimg.cn/blog_migrate/312e50344fe59aace0ff5abe2f91ba66.png)
点号+星号特殊字符组合起来可以匹配任意数量的任意字符,如下:
![](https://i-blog.csdnimg.cn/blog_migrate/9ce9f4b83c11d4a759dc5fe10b86ac4a.png)
3. 扩展正则表达式
POSIX ERE模式包括了一些可供Linux应用和工具使用的额外符号。gawk程序能够识别ERE 模式,但sed编辑器不能。
3.1 问号
问号表明前面的字符可以出现0次或1次,它不会匹配多次出现的字符。
![](https://i-blog.csdnimg.cn/blog_migrate/1b18746fea80aa5a1f1c4a3aedb30182.png)
3.2 加号
加号表明前面的字符可以出现1次或多次,但必须至少出现1次。如果该字符没有出现,那么模式就不会匹配。
![](https://i-blog.csdnimg.cn/blog_migrate/c940e0fdcaf09a8de3d2f92f8ac63064.png)
3.3 使用花括号
间隔(interval):ERE中的花括号允许你为可重复的正则表达式指定一个上限。
可以使用两种方式来指定区间:
m:正则表达式准确出现m次。
m, n:正则表达式至少出现m次,至多n次。
注意:必须指定gawk程序的--re-interval 命令行选项才能识别正则表达式间隔。
![](https://i-blog.csdnimg.cn/blog_migrate/1115794ade743d947f503f18db16f786.png)
3.4 管道符号
管道符号允许你在检查数据流时,用逻辑OR方式指定正则表达式引擎要用的两个或多个模式。如果任何一个模式匹配了数据流文本,文本就通过测试。如果没有模式匹配,则数据流文本匹配失败。
![](https://i-blog.csdnimg.cn/blog_migrate/bbdef91f580585f39bbe30c697e2d587.png)
3.5 表达式分组
正则表达式模式也可以用圆括号进行分组。
![](https://i-blog.csdnimg.cn/blog_migrate/243d256966d25f4d99df9dbedacae56d.png)
4.正则表达式实战
目录文件计数示例:
![](https://i-blog.csdnimg.cn/blog_migrate/b3a144978bdb2814a4f598a88b047f61.png)
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/411d7ed15c159da59ffd8fabe99d3a0b.png)
验证电话号码示例:
^\(?:脱字符用来表明数据的开始。由于左圆括号是个特殊字符,因此必须将它转义成普通字符。问号表明左圆括号可能出现,也可能不出现。
[2-9][0-9]{2}:要求第一个字符是2~9的数字,后跟任意两位数字。
\)?:在区号后面,收尾的右圆括号可能存 在,也可能不存在。
(| |-|\.):在区号后,存在如下可能:有一个空格,没有空格,有一条单破折线或一个点。第一个管道符号紧跟在左圆括号后,用来匹配没有空格的情形。必须将点字符转义,否则它会被解释成可匹配任意字符。
[0-9]{3}:紧接着是3位号码。
( |-|\.):在电话号码之后,你必须匹配一个空格、一条单破折线或一个点。
[0-9]{4}$:最后,必须在字符串尾部匹配4位本地电话分机号。
![](https://i-blog.csdnimg.cn/blog_migrate/9fc9967f0bf830d5880a887171d69a5f.png)