文章目录
Shell(11)正则表达式
前言
正则表达式,又称规则表达式。(英语:Regular Expression),在代码中常简写为 regex、regexp 或 RE),计算机科学的一个概念。正则表达式通被用来检索、替换那些符合某个模式(规则)的文本。
正则表达式不只有一种,而且 LINUX 中不同的程序可能会使用不同的正则表达式,如工具:grep sed awk。
LINUX 中常用的有两种正则表达式引擎
基础正则表达式:BRE
扩展正则表达式:ERE
一、正则表达式的组成
正则表达式—通常用于判断语句中,用来检查某一字符串是否满足某一格式
正则表达式是由普通字符与元字符组成。
普通字符包括大小写字母、数字、标点符号及一些其他符号。
元字符是指在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
二、基础正则表达式(BRE)中元字符
支持的工具:grep、egrep、sed、awk
定位符 | 含义 |
---|---|
^ | 匹配行首,则是匹配字符串的开始tux匹配以tux开头的行 |
$ | 匹配行尾, 则是匹配字符串的结尾 t u x 则是匹配字符串的结尾tux 则是匹配字符串的结尾tux匹配以tux结尾的行 |
转义符 | 含义 |
---|---|
\ | 转义符,将特殊字符进行转义,忽略其特殊意义a \ .b匹配a.b,但不能匹配ajb,.被转义为字符失去特殊意义 |
\n | 匹配一个换行符 |
\r | 匹配一个回车符 |
\t | 匹配一个制表符(TAB键) |
元字符 | 含义 |
---|---|
. | 匹配除换行符\r\n之外的任意单个字符 |
[ ] | 匹配list列表中的一个字符 例: go[ola]d,[abc]、[a-z]、[a-z0-9] |
[^] | 匹配任意不在list列表中的一个字符 例: [ ^a-z]、[ ^0-9]、[ ^A-Z0-9] |
* | 匹配前面子表达式0次或者多次 例:goo*d、go.*d |
\ {n\ } | 匹配前面的子表达式n次,例:go\ {2\ }d、'[O-9]\ {2\ }'匹配两位数字 |
\ {n,\ } | 匹配前面的子表达式不少于n次,例: go\ {2,}d、’ [0-9]\ {2,\ }'匹配两位及两位以上数字 |
\ {n,m\ } | 匹配前面的子表达式n到m次,例: go\ {2,3\ )d、'[0-9]\ {2,3\ }'匹配两位到三位数字 |
注: egrep、awk使用{n}、{n, }、{n, m}匹配时“{}”前不用加“\”
egrep -E -n 'wo{2}d' 1.txt #-E 用于显示文件中符合条件的字符
egrep -E -n 'wo{2,3}d' 1.txt #查看1.txt文件中的包含2到3个o的wod字符串
三、扩展正则表达式(ERE)的元字符
支持的工具:egrep、awk。
通常情况下会使用基础正则表达式就已经足够了,但有时为了简化整个指令,需要使用 范围更广的扩展正则表达式。例如,使用基础正则表达式查询除文件中空白行与行首为“#”,而通常情况下会使用基础正则表达式就已经足够了,但有时为了简化整个指令,需要使用 范围更广的扩展正则表达式。例如,使用基础正则表达式查询除文件中空白行与行首为“#”。
与基础正则表达式类型相同,扩展正则表达式也包含多个元字符,常见的扩展正则表达 式的元字符主要包括以下几个:
元字符 | 含义 |
---|---|
+ | 重复一个或者一个以上的前一个字符 |
? | 零个或者一个的前一个字符 |
| | 使用或者(or)的方式找出多个字符 |
() | 查找“组”字符串 |
()+ | 辨别多个重复的组 |
四、元字符操作的案列
(1)查找特定字符
查找特定字符非常简单,如执行以下命令即可从1.txt 文件中查找出特定字符“b”所在位置。其中“-n”表示显示行号、“-i”表示不区分大小写。命令执行后,符合匹配标准的字符, 字体颜色会变为红色(本章中全部通过加粗显示代替)。
(2)利用中括号“[]”来查找集合字符
想要查找“shirt”与“short”这两个字符串时,可以发现这两个字符串均包含“sh”与“rt”。此时执行以下命令即可同时查找到“shirt”与“short”这两个字符串,其中“[]”中无论有几个字符, 都仅代表一个字符,也就是说“[io]”表示匹配“i”或者“o”。
若查找“o”前面不是“h”的字符串,只需要通过集合字符的反向选择“[^]”来实现该目的。
若不希望“o”前面存在小写字母,或者数字的话需要使用[ ^a-z]或[ ^0-9]来表示。
(3)查找行首“^”与行尾字符“$”
基础正则表达式包含两个定位元字符:“^”(行首)与“$”(行尾)。在上面的示例中, 查询“o”字符串时出现了很多包含“o”的行,如果想要查询以“o”字符串为行首的行,则可以通过“^”元字符来实现。
查询以小写字母开头的行可以通过“ ^ [a-z]”规则来过滤,查询大写字母开头的行则使用“^ [A-Z]”规则,若查询不以字母开头的行则使用“ [ ^a-zA-Z]”规则。
“^”符号在元字符集合“[]”符号内外的作用是不一样的,在“[]”符号内表示反向选择,在“[]” 符号外则代表定位行首。反之,若想查找以某一特定字符结尾的行则可以使用“$”定位符。例如,执行以下命令即可实现查询以小数点(.)结尾的行。因为小数点(.)在正则表达式中也是一个元字符(后面会讲到),所以在这里需要用转义字符“\”将具有特殊意义的字符转化成普通字符。
当查询空白行时,使用‘^$’正则表达式即可。
(4)查找任意一个字符“.”与重复字符“*”
前面提到,在正则表达式中小数点(.)也是一个元字符,代表任意一个字符。例如执行以下命令就可以查找“w???d”的字符串,即共有四个字符,以 w 开头 d 结尾。
在上述结果中,“world”字符串“w…d”匹配规则。若想要查询 oo、ooo、ooooo 等资料, 则需要使用星号(*)元字符。但需要注意的是,“ *”代表的是重复零个或多个前面的单字符。 “o *”表示拥有零个(即为空字符)或大于等于一个“o”的字符,因为允许空字符,所以执行“grep -n ‘o *’ 1.txt”命令会将文本中所有的内容都输出打印。如果是“oo *”,则第一个 o 必须存在, 第二个 o 则是零个或多个 o,所以凡是包含 o、oo、ooo、ooo,等的资料都符合标准。同理,若查询包含至少两个 o 以上的字符串,则执行“grep -n ‘ooo *’ 1.txt”命令即可。
执行以下命令即可查询以 w 开头 d 结尾,中间的字符可有可无的字符串。
(5)查找连续字符范围“{}”
在上面的示例中,使用了“.”与“*”来设定零个到无限多个重复的字符,如果想要限制一个范围内的重复的字符串该如何实现呢?例如,查找三到五个 o 的连续字符,这个时候就需要使用基础正则表达式中的限定范围的字符“{}”。因为“{}”在 Shell 中具有特殊意义,所以在使用“{}”字符时,需要利用转义字符“\”,将“{}”字符转换成普通字符。“{}”字符的使用方法如下所示。
① 查询两个 o 的字符。
② 查询以 w 开头以 d 结尾,中间包含 2~5 个 o 的字符串。
③ 查询以 w 开头以 d 结尾,中间包含 2 个或 2 个以上 o 的字符串。
END