Linux 正则表达式 的简介
- 一、📖 正则表达式的两种主要"风格"
- 二、🔤 核心元字符与语法格式(以ERE为例)
-
-
- 定位符(锚点)
-
- 匹配字符
-
- 指定数量(量词)
-
- 分组与选择
-
- 三、💻 在Linux常用命令中的实战示例
- 四、⚠️ 重要注意事项与技巧
Linux 中的正则表达式 是一种强大、灵活且高效的文本模式匹配工具。它通过一系列特殊字符和普通字符的组合,定义一个"搜索规则"或"匹配模式",用于在文本中进行查找、替换、提取等操作。可以说,它是处理文本的"瑞士军刀"。
简单来说,正则表达式 = 普通字符 + 特殊字符(元字符)。
一、📖 正则表达式的两种主要"风格"
在Linux中,最常遇到的是以下两种风格,主要由 grep, sed, awk 等工具支持,其核心差异在于对元字符的转义要求不同:
| 特性 | 基本正则表达式 (BRE) | 扩展正则表达式 (ERE) | 说明与建议 |
|---|---|---|---|
| 启用方式 | grep 的默认模式 |
grep -E 或 egrep |
最常用的差异,务必记住。 |
| 元字符 | 仅 ^ $ . [ ] * 是元字符 |
增加 `( ) { } ? + | ` 为元字符 |
| 举例:匹配2-3个a | a\{2,3\} (需转义) |
a{2,3} (无需转义) |
你之前用的 ={2,} 是 ERE 语法,所以要用 grep -E。 |
| 选择分支 | 不支持 | `(pattern1 | pattern2)` |
| 分组 | \(...\) (需转义) |
(...) |
将一部分模式括起来,用于后续引用或应用量词。 |
核心建议 :初学者建议直接学习和使用扩展正则表达式,因为它更直观、强大,且是现代编程语言(如Python, JavaScript)中正则语法的基础。
二、🔤 核心元字符与语法格式(以ERE为例)
下表是必须掌握的"语法单词",按照功能分类:
1. 定位符(锚点)
| 元字符 | 含义 | 示例 | 匹配内容 |
|---|---|---|---|
^ |
匹配行的开始 | ^Hello |
以 "Hello" 开头的行。 |
$ |
匹配行的结束 | world$ |
以 "world" 结尾的行。 |
\b |
匹配单词边界 | \bthe\b |
独立的单词 "the",而非 "there" 中的 "the"。 |
2. 匹配字符
| 元字符 | 含义 | 示例 | 匹配内容 |
|---|---|---|---|
. |
匹配任意一个字符(换行符除外) | a.c |
"abc", "adc", "a@c" 等。 |
[ ] |
字符组,匹配其中任意一个字符 | [aeiou] |
任意一个元音字母。 |
[^ ] |
否定字符组,匹配不在其中的字符 | [^0-9] |
任意一个非数字字符。 |
\d |
匹配一个数字(部分工具支持) | \d+ |
一个或多个数字。在Linux传统工具中,等价的BRE写法是 [[:digit:]] 或 [0-9]。 |
\w |
匹配一个单词字符(字母、数字、下划线) | \w+ |
一个或多个单词字符。BRE中等价于 [[:alnum:]_]。 |
3. 指定数量(量词)
| 元字符 | 含义 | 示例 | 匹配内容 |
|---|---|---|---|
* |
匹配前面的元素0次或多次 | ab*c |
"ac", "abc", "abbc" ... |
+ |
匹配前面的元素1次或多次 | ab+c |
"abc", "abbc" ... (不含"ac") |
? |
匹配前面的元素0次或1次 | colou?r |
"color" 或 "colour"。 |
{n} |
匹配前面的元素恰好 n 次 | a{3} |
"aaa"。 |
{n,} |
匹配前面的元素至少 n 次 | a{2,} |
"aa", "aaa", "aaaa" ... (你之前关卡用到的) |
{n,m} |
匹配前面的元素n 到 m 次 | a{2,4} |
"aa", "aaa", "aaaa"。 |
4. 分组与选择
| 元字符 | 含义 | 示例 | 匹配内容 |
|---|---|---|---|
( ) |
分组,将多个元素视为一个单元 | (ab)+ |
"ab", "abab", "ababab" ... |
| ` | ` | 选择,匹配左边或右边的模式 | `cat |
三、💻 在Linux常用命令中的实战示例
假设我们有一个文件 test.txt,内容如下:
Hello, world!
My email is alice@example.com.
The price is $19.99.
The numbers are 42, 7, and 1024.
| 你想做的事 | 使用的正则表达式命令 | 解释与输出 |
|---|---|---|
| 查找包含"email"的行 | grep 'email' test.txt |
普通查找,非正则。 |
| 查找以"The"开头的行 | grep '^The' test.txt |
使用锚点 ^。 |
| 查找所有数字 | grep -Eo '[0-9]+' test.txt |
-o 只输出匹配部分。输出:19, 99, 42, 7, 1024。 |
| 查找所有价格($数字.数字) | grep -Eo '\$[0-9]+\.[0-9]{2}' test.txt |
匹配美元价格格式。输出:$19.99。注意 $ 和 . 需要转义。 |
| 查找邮箱地址 | grep -Eo '[[:alnum:]._%+-]+@[[:alnum:].-]+\.[[:alpha:]]{2,}' test.txt |
一个简化版的邮箱匹配。输出:alice@example.com。 |
用 sed 替换所有数字为"NUM" |
sed -E 's/[0-9]+/NUM/g' test.txt |
将文件中所有连续数字替换为"NUM"。 |
用 find 找 .txt 和 .log 文件 |
`find . -regex '.*.\(txt | log)'` (BRE) |
四、⚠️ 重要注意事项与技巧
- 贪婪匹配 :正则默认是"贪婪"的,会匹配尽可能长的字符串。例如,
a.*b匹配 "axxxbyyyb" 中的 "axxxbyyyb",而不是 "axxxb"。可以使用.*?来启用"非贪婪"匹配(ERE中部分工具支持,如grep -P的Perl模式)。 - 特殊字符转义 :如果你想匹配元字符本身(如
.、*、$),需要在它前面加上反斜线\进行转义。例如,\$匹配美元符号,\.匹配点号。 - 性能 :复杂的正则表达式(尤其是嵌套
*和+)在超大文本中可能很慢。尽量让模式精确。 - 工具差异 :
grep、sed、awk、find对正则的支持程度和默认风格有细微差别,使用时注意查阅手册(man command)。grep -P支持功能最全的Perl正则,但非所有系统默认安装。
学习路径建议 :从 grep -E 和 sed -E 开始练习,重点掌握 ^、$、[...]、*、+、?、{ }、|、( ) 这些核心元字符。理解它们后,你已经能解决Linux中90%的文本匹配问题了。