Linux基础之正则表达式

正则表达式
1.简介
概念:由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或通配的功能。

功能:正则表达式使用单个字符来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。

分类:基本正则表达式和扩展正则表达式。

正则表达式在Linux中很常见,日常使用的一些命令(如grep,sed,awk)也会用到正则表达式(命令输出中包含正则表达式)。
下面使用grep命令来说明正则表达式的应用。

2.正则表达式中字符
分为普通文本字符和元字符。
普通字符:例如a,b,1这些字符,只存在字面上的含义,没有隐含意义。
元字符:在正则表达式有着特别意义的字符。

3.基本正则表达式元字符(分四类)
(1)字符匹配

. 匹配任意单个字符
[^] 匹配指定范围外的单个字符
[] 匹配指定范围内的任意单个字符
[:space:] 空白字符(空格)
[:digit:] 数字
[:lower:] 小写字母
[:upper:] 大写字母
[:alpha:] 所有字母
[:alnum:] 数字和字母
[:punct:] 所有标点符号

实例
[[email protected] anli]# cat z4
woshirootjingangtui
tashirOOttietougong
①:[[email protected] anli]# grep “r[[:alpha:]][[:alpha:]]t” z4 #匹配文件z4中r和t之间有两个字母(不区分大小写)的字符串
Linux基础之正则表达式
②:[[email protected] anli]# grep “r[^ [:alpha:]][^ [:alpha:]]t” z4 #匹配r和t之间不是字母的字符串

(2)匹配次数

* 匹配其前面的字符任意次
.* 匹配任意长度的任意字符
\ ? 匹配前面的字符0次或1次
\ + 匹配前面的字符至少一次
\ {m\ } 匹配前面的字符m次
\ {m,n\ } 匹配前面的字符至少m次,至多n次
\ {0,n\ } 匹配前面字符至多n次
\ {m,\ } 匹配前面至少m次

实例
Linux基础之正则表达式

(3)位置锚定(注意区分词首/尾和行首/尾)

^ 行首锚定
$ 行尾锚定
^PATTERN 用于模式匹配整行
^$ 空白行
^ [[:space:]]*$ 空行或包含空白字符的行
-单词- -非特殊字符组成的连续字符(字符串)-
\ <或\b 词首锚定,用于单词模式的左侧
\ >或\b 词尾锚定,用于单词模式的右侧
\ <PATTERN\ > 匹配完整单词

实例
Linux基础之正则表达式

(4)分组及引用

\ ( \ ) 将一个或多个字符捆绑在一起,当作一个整体进行处理
\ (xy\ )*ab 格式(命令行中括号有特殊意义所以用转义符\把它转译为普通字符)
Note 分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中(即使括号内内容与\1变量内容相同),这些变量为:\1;\2…
\1 模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符
\2 模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符

实例
Linux基础之正则表达式

4.区分正则表达式和通配符
(1)通配符可以说只有*,?,[],[^]这四种;而正则表达式则比较复杂。
(2)*在通配符中表示匹配任意长度的任意字符;而在正则表达式中表示匹配其前面的一个字符任意次。
(3)通配符一般只用于匹配文件名(常用命令为ls,cp…);而正则表达式则大多用于匹配文件内容里的符合规则的字符串(常用命令为grep,awk,sed…)。