文章目录
- 1. 正则表达式定义
- 2. 基础正则表达式(BRE)
- 3. 扩展正则表达式(ERE)
- 4. 通配符(Wildcards)
- 5. 案例与分析
- **案例1:提取IP地址**
- **案例2:批量重命名文件**
- **案例3:过滤日志中的错误信息**
- **案例4:匹配邮箱地址**
- 总结
1. 正则表达式定义
正则表达式(Regular Expression,简称 regex) 是一种通过特定语法规则描述字符串模式的工具,用于匹配、搜索、替换文本。其核心由普通字符(如字母、数字)和元字符(特殊符号)组成,能够灵活定义复杂的匹配规则。
应用场景:
- 文本搜索(如
grep) - 字符串替换(如
sed) - 数据验证(如表单输入)
- 日志分析
2. 基础正则表达式(BRE)
基础正则表达式是正则表达式的早期标准,需用 \ 转义部分元字符,支持以下核心语法:
| 元字符 | 说明 | 示例 |
|---|---|---|
. | 匹配任意单个字符(除换行符) | a.c → abc, aXc |
^ | 匹配字符串开头 | ^start → 以start开头的行 |
$ | 匹配字符串结尾 | end$ → 以end结尾的行 |
* | 前一个字符出现0次或多次 | ab*c → ac, abbc |
\+ | 前一个字符出现1次或多次 | a\+b → ab, aaab |
\? | 前一个字符出现0次或1次 | a\?b → b, ab |
\{n\} | 前一个字符出现n次 | a\{3\} → aaa |
\{n,m\} | 前一个字符出现n到m次 | a\{2,4\} → aa, aaaa |
[ ] | 匹配括号内任意一个字符 | [aeiou] → 匹配任意元音字母 |
[^ ] | 匹配不在括号内的字符 | [^0-9] → 匹配非数字字符 |
\ | 转义特殊字符 | \. → 匹配字面意义的. |
特点:
- 需用
\转义元字符如\+,\?,\{ \}。 - 默认不支持
|(或)和()(分组)。
3. 扩展正则表达式(ERE)
扩展正则表达式简化了语法,无需转义部分元字符,支持更复杂的逻辑:
| 元字符 | 说明 | 示例 |
|---|---|---|
+ | 前一个字符出现1次或多次 | ab+ → ab, abbb |
? | 前一个字符出现0次或1次 | a?b → b, ab |
{n} | 前一个字符出现n次 | a{3} → aaa |
{n,m} | 前一个字符出现n到m次 | a{2,4} → aa, aaaa |
| ` | ` | 逻辑“或” |
() | 分组,可结合 ` | ` 使用 |
特点:
- 无需转义
+,?,{ },|,()。 - 使用
egrep或grep -E启用扩展模式。
4. 通配符(Wildcards)
通配符用于文件名匹配(如 ls, find),语法与正则表达式不同:
| 通配符 | 说明 | 示例 |
|---|---|---|
* | 匹配任意数量任意字符 | *.txt → 所有.txt文件 |
? | 匹配单个任意字符 | file?.log → file1.log, fileA.log |
[ ] | 匹配括号内任意一个字符 | [abc]* → 以a、b、c开头的文件 |
[^ ] | 排除括号内的字符 | [^0-9]* → 不以数字开头的文件 |
注意:
- 通配符由Shell解析,正则表达式由文本工具(如
grep,sed)解析。 - 通配符的
*和?不同于正则表达式中的含义。
5. 案例与分析
案例1:提取IP地址
目标:从文本中提取 IPv4 地址(如 192.168.1.1)。
正则表达式:
grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' file.txt
[0-9]{1,3}:匹配0-999的数字。\.:匹配点号。{3}:前一部分重复3次(即前三段IP)。-E:启用扩展正则表达式。
案例2:批量重命名文件
目标:将 file1.txt, file2.txt 重命名为 backup1.txt, backup2.txt。
通配符 + Shell命令:
for f in file*.txt; do mv "$f" "backup${f#file}"; done
file*.txt:匹配所有以file开头、.txt结尾的文件。${f#file}:删除文件名中的file前缀。
案例3:过滤日志中的错误信息
目标:从日志文件中提取包含 ERROR 或 WARN 的行。
正则表达式:
grep -E 'ERROR|WARN' app.log
|:逻辑“或”,匹配ERROR或WARN。-E:启用扩展正则表达式。
案例4:匹配邮箱地址
目标:验证简单的邮箱格式(如 user@example.com)。
正则表达式:
grep -E '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$' emails.txt
^和$:严格匹配整个字符串。[a-zA-Z0-9._%+-]+:用户名部分(允许字母、数字、符号)。@和.:匹配邮箱中的固定符号。[a-zA-Z]{2,}:域名后缀(如com,org)。
总结
| 工具 | 用途 | 关键区别 |
|---|---|---|
| 正则表达式 | 文本内容匹配(grep, sed) | 语法复杂,支持分组、量词、逻辑或 |
| 通配符 | 文件名匹配(ls, find) | 语法简单,由Shell解析 |
核心技巧:
- 区分场景:通配符用于文件名,正则表达式用于文本内容。
- 转义规则:BRE需转义
+,?,{ },ERE无需转义。 - 贪婪匹配:正则表达式默认贪婪匹配(如
.*会匹配最长可能字符串)。
掌握正则表达式和通配符是Linux文本处理的必备技能,通过案例实践可快速提升熟练度!
