<笔记> Linux正则表达式总结

正则表达式是处理文本的强大工具,它可以通过特定的规则来匹配、查找、替换文本,在 Linux 的文本处理工具中非常常用。在 Linux 中,正则表达式依照严谨度分为两类:基础正则表达式(BRE)和扩展正则表达式(ERE),两者的功能和支持的符号有所区别,下面我们就来详细梳理。

一、基础正则表达式(BRE)

基础正则表达式是最基础的正则语法,grep、sed 这类工具默认支持的就是基础正则,它提供了最核心的文本匹配能力。

常用元字符说明

元字符 作用说明
^ 匹配行的开头,比如 ^root 代表匹配以 root 开头的行
$ 匹配行的结尾,比如 bash$ 代表匹配以 bash 结尾的行
\. 匹配任意一个字符(不包括空行)
\\ 转义字符,去掉特殊字符的原本含义
\* 匹配前面的字符 0 次或多次
\[\] 匹配括号内的任意一个字符,比如 \[abc\] 代表匹配 a、b、c 中的任意一个
\[^\] 反向选择,匹配不在括号内的任意一个字符,比如 \[^a\-z\] 代表匹配非小写字母的字符
\{n,m\} 匹配前面的字符 n 到 m 次,比如 o\{2\} 代表匹配连续 2 个 o

实操示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 示例1:查找passwd中以root开头的行
[dmtsai@study ~]$ nl /etc/passwd | grep '^root'
1 root:x:0:0:root:/root:/bin/bash

# 示例2:查找以bash结尾的行
[dmtsai@study ~]$ nl /etc/passwd | grep 'bash$'
1 root:x:0:0:root:/root:/bin/bash
25 dmtsai:x:1000:1000:dmtsai:/home/dmtsai:/bin/bash

# 示例3:查找包含go或者gl的行
[dmtsai@study ~]$ nl /etc/passwd | grep 'g[ol]'

# 示例4:查找非小写字母开头的行
[dmtsai@study ~]$ nl /etc/passwd | grep '^[^a-z]'

# 示例5:查找包含连续两个o的行
[dmtsai@study ~]$ nl /etc/passwd | grep 'o\{2\}'

# 示例6:删除配置文件中的空行和注释行
[dmtsai@study ~]$ cat /etc/man_db.conf | grep -v '^$' | grep -v '^#'

二、扩展正则表达式(ERE)

扩展正则表达式在基础正则的基础上,增加了更多的语法支持,不需要对部分符号进行转义,使用起来更方便,我们可以通过 grep \-E 或者 egrep 来启用扩展正则的支持。

常用元字符说明

元字符 作用说明
\+ 匹配前面的字符 1 次或多次
? 匹配前面的字符 0 次或 1 次
` ` 或的方式,同时匹配多个字符串,比如 `gd good` 代表匹配 gd 或者 good
\(\) 分组,将多个字符作为一个整体来处理,比如 `(gd good)dog`
\{n,m\} 匹配前面的字符 n 到 m 次,和基础正则不同,这里不需要加转义符

实操示例

1
2
3
4
5
6
7
8
9
10
11
# 示例1:同时查找包含god或者good的行
[dmtsai@study ~]$ egrep 'god|good' test.txt

# 示例2:查找包含一个或多个o的行
[dmtsai@study ~]$ egrep 'go+d' test.txt

# 示例3:查找包含0个或1个o的行
[dmtsai@study ~]$ egrep 'go?d' test.txt

# 示例4:分组匹配,查找gd或者good后面接dog的行
[dmtsai@study ~]$ egrep '(gd|good)dog' test.txt

三、常见注意事项

正则与通配符的区别

很多新手会混淆正则表达式和通配符,两者的含义完全不同:

  • 通配符是用来匹配文件名的,其中 \* 代表的是任意长度的任意字符

  • 正则表达式是用来匹配文本内容的,其中 \* 代表的是重复前面的字符 0 次或多次

工具的默认支持

不同的工具对正则的支持有所区别:

  • 默认情况下,grep、sed 使用的是基础正则表达式

  • 如果要使用扩展正则,需要加上 \-r(sed)或者 \-E(grep)参数,或者直接使用 egrep

  • 部分工具如 awk 默认就支持扩展正则表达式


正则表达式是 Linux 文本处理的核心能力,灵活搭配之前的管线命令,就可以完成非常复杂的文本处理任务,极大提升我们的工作效率。