正则表达式是处理文本的强大工具,它可以通过特定的规则来匹配、查找、替换文本,在 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 | # 示例1:查找passwd中以root开头的行 |
二、扩展正则表达式(ERE)
扩展正则表达式在基础正则的基础上,增加了更多的语法支持,不需要对部分符号进行转义,使用起来更方便,我们可以通过 grep \-E 或者 egrep 来启用扩展正则的支持。
常用元字符说明
| 元字符 | 作用说明 | ||
|---|---|---|---|
\+ |
匹配前面的字符 1 次或多次 | ||
? |
匹配前面的字符 0 次或 1 次 | ||
| ` | ` | 或的方式,同时匹配多个字符串,比如 `gd | good` 代表匹配 gd 或者 good |
\(\) |
分组,将多个字符作为一个整体来处理,比如 `(gd | good)dog` | |
\{n,m\} |
匹配前面的字符 n 到 m 次,和基础正则不同,这里不需要加转义符 |
实操示例
1 | # 示例1:同时查找包含god或者good的行 |
三、常见注意事项
正则与通配符的区别
很多新手会混淆正则表达式和通配符,两者的含义完全不同:
通配符是用来匹配文件名的,其中
\*代表的是任意长度的任意字符正则表达式是用来匹配文本内容的,其中
\*代表的是重复前面的字符 0 次或多次
工具的默认支持
不同的工具对正则的支持有所区别:
默认情况下,grep、sed 使用的是基础正则表达式
如果要使用扩展正则,需要加上
\-r(sed)或者\-E(grep)参数,或者直接使用 egrep部分工具如 awk 默认就支持扩展正则表达式
正则表达式是 Linux 文本处理的核心能力,灵活搭配之前的管线命令,就可以完成非常复杂的文本处理任务,极大提升我们的工作效率。