linux正则匹配
在 Linux 系统中,正则表达式(Regular Expression)广泛用于文本搜索、匹配和处理,常见工具如grep、sed、awk等都依赖正则匹配。正则表达式通过元字符(特殊符号)定义匹配规则,根据工具支持程度分为基础正则(BRE) 和扩展正则(ERE)。
一、基础正则(BRE,Basic Regular Expressions)
基础正则是多数工具的默认模式(如grep、sed默认),核心元字符及含义如下:
| 元字符 | 含义 | 示例 |
|---|---|---|
. | 匹配任意单个字符(除换行符\n) | a.b 匹配 aab、acb、a-b 等(中间任意 1 个字符) |
* | 匹配前面的字符0 次或多次(贪婪匹配) | a*b 匹配 b(a 出现 0 次)、ab(a1 次)、aaab(a3 次)等 |
^ | 匹配行首(开头位置) | ^root 匹配以 root 开头的行(如root:x:0:0:...) |
$ | 匹配行尾(结尾位置) | bash$ 匹配以 bash 结尾的行(如user:x:1000:1000:.../bin/bash) |
[] | 匹配字符集中的任意一个字符(范围用-,如[a-z]、[0-9]) | [Rr]oot 匹配 Root 或 root;[0-9] 匹配任意数字 |
[^] | 匹配不在字符集中的任意一个字符(反向匹配) | [^0-9] 匹配非数字字符;[^a-zA-Z] 匹配非字母字符 |
\< / \b | 匹配单词开头(单词边界,仅对字母 / 数字 / 下划线组成的 “单词” 有效) | \<test 匹配以 test 开头的单词(如test123不匹配,test abc匹配) |
\> / \b | 匹配单词结尾(单词边界) | test\> 匹配以 test 结尾的单词(如mytest匹配,test123不匹配) |
\(` `\) | 分组(将部分表达式视为整体,需转义) | \(ab\)* 匹配 ab 整体重复 0 次或多次(如abab、空) |
\n | 反向引用(引用第 n 个分组的内容,n 为 1-9) | sed 's/\(hello\) world/\1 there/' 替换 hello world 为 hello there(\1 引用分组 1 的hello) |
二、扩展正则(ERE,Extended Regular Expressions)
扩展正则在基础正则上增加了更多元字符,且无需转义(部分工具需加选项启用,如grep -E、sed -r)。核心元字符如下:
| 元字符 | 含义 | 示例 | |||
|---|---|---|---|---|---|
+ | 匹配前面的字符1 次或多次(比*更严格,至少 1 次) | a+b 匹配 ab、aab 等(a 至少 1 次),不匹配 b | |||
? | 匹配前面的字符0 次或 1 次(可选) | a?b 匹配 b(a0 次)或 ab(a1 次),不匹配 aab | |||
| ` | ` | 逻辑 “或”,匹配左右任意一个表达式 | `cat | dog匹配cat或dog;(a | b)c匹配ac或bc` |
() | 分组(无需转义,功能同基础正则的\(\)) | (ab)+ 匹配 ab 重复 1 次或多次(如ab、abab) | |||
{n} | 匹配前面的字符恰好 n 次(n 为正整数) | a{3} 匹配 aaa(a 恰好 3 次) | |||
{n,} | 匹配前面的字符至少 n 次 | a{2,} 匹配 aa、aaa 等(a 至少 2 次) | |||
{n,m} | 匹配前面的字符n 到 m 次(n≤m) | a{2,4} 匹配 aa、aaa、aaaa(a2-4 次) |
三、常用工具的正则支持
不同工具对正则的支持略有差异,需注意选项:
grep:
- 默认支持基础正则;
- 加
-E选项(或用egrep)启用扩展正则; - 示例:
bash
grep '^root' /etc/passwd # 基础正则:匹配以root开头的行 grep -E 'a{2,3}' file # 扩展正则:匹配a连续出现2-3次的内容
sed:
- 默认支持基础正则;
- 加
-r选项启用扩展正则; - 示例:
bash
sed 's/old.*/new/' file # 基础正则:替换以old开头的行为new sed -r 's/(a|b)c/X/' file # 扩展正则:替换ac或bc为X
awk:
- 内置支持扩展正则(无需选项),用
~表示匹配; - 示例:
bash
awk '/^[0-9]+$/' file # 匹配全为数字的行 awk '$1 ~ /(user|admin)/' file # 第一列包含user或admin的行
- 内置支持扩展正则(无需选项),用
四、注意事项
- 区分正则与通配符:正则用于文本内容匹配(如
grep),通配符(*、?等)用于文件名匹配(如ls *.txt),两者规则不同。 - 转义问题:基础正则中,
+、?、|、()、{}需用\转义才能表示特殊含义;扩展正则中无需转义。 - 贪婪匹配:
*、+等默认是贪婪的(尽可能匹配最长内容),部分工具(如grep -P支持 Perl 正则)可通过?实现非贪婪(如.*?)。
