正则表达式(Regular Expressions)
Completion requirements
Unix Shell(Shell Glob)中的正则表达式
Unix Shell(如 Bash、Korn shell)提供了一种文件名匹配的模式语法(glob 语法),可以视作基本正则表达式的简化版。
Shell 通配符(Glob)运算符
| 运算符 | 作用 |
|---|---|
? |
匹配任意单个字符 |
[ ] |
字符类,匹配方括号内的任意字符 |
[! ] |
反向字符类,匹配不在方括号内的字符(POSIX 标准) |
[^ ] |
反向字符类(GNU Bash 扩展) |
* |
匹配 0 个或多个字符 |
?(pattern-list) |
匹配 0 或 1 次(仅在 extglob 启用时可用) |
*(pattern-list) |
匹配 0 次或多次(extglob 扩展) |
+(pattern-list) |
匹配 1 次或多次(extglob 扩展) |
@(pattern-list) |
匹配 完全等于 pattern-list 中的一个模式(extglob 扩展) |
!(pattern-list) |
匹配不等于 pattern-list 的任何内容(extglob 扩展) |
Shell Glob 与常见正则表达式的区别
-
*(星号)和?(问号) 作用不同- 在 正则表达式 中:
*匹配前一个字符的 0 次或多次(如a*匹配a、aaa或"")?匹配前一个字符的 0 次或 1 次(如a?匹配a或"")
- 在 Shell Glob 中:
*匹配任意多个字符?匹配单个字符
- 在 正则表达式 中:
-
Shell Glob 的反向字符类
- POSIX 标准 使用
!(如[!abc]表示不匹配a、b或c) - GNU Bash 扩展 允许使用
^(如[^abc])
- POSIX 标准 使用
-
扩展的
extglob语法?(pattern-list)、*(pattern-list)、+(pattern-list)等 仅在 Korn shell 和 Bash(启用shopt -s extglob)中可用- 默认 Shell(如 Zsh)不支持,需要手动启用
适用工具
- 标准 POSIX Shell(支持一般 glob 语法)
- Korn Shell(Ksh)
- GNU Bash(
extglob需要shopt -s extglob启用)
总结
| Emacs 正则 | Shell Glob | |
|---|---|---|
| 特点 | 结合 BRE + ERE,支持 GNU 扩展 | 主要用于文件名匹配 |
| 匹配单词字符 | \w |
无直接等价,需手动指定字符类 |
| 匹配数字 | [0-9] 或 [:digit:] |
[0-9] |
| 匹配空白字符 | \s- |
[ \t] |
| 支持扩展 | GNU 扩展(\<, \> 等) |
extglob(需启用) |
| 适用场景 | Emacs 编辑器 处理文本 | Shell 文件名匹配 |
- Emacs 的正则表达式更适用于文本编辑(支持单词边界匹配、缓冲区匹配等)
- Shell Glob 主要用于文件名匹配(支持
*、?、extglob扩展)
这些正则表达式语法和工具在不同的环境下提供了不同程度的灵活性,选择正确的工具可以提高文本处理和自动化任务的效率。
Last modified: Thursday, 30 January 2025, 2:25 AM