Shell(12)正则表达式

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

猜你喜欢

转载自blog.csdn.net/tu464932199/article/details/125833880