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 与常见正则表达式的区别

  1. *(星号)和 ?(问号) 作用不同

    • 正则表达式 中:
      • * 匹配前一个字符的 0 次或多次(如 a* 匹配 aaaa""
      • ? 匹配前一个字符的 0 次或 1 次(如 a? 匹配 a""
    • Shell Glob 中:
      • * 匹配任意多个字符
      • ? 匹配单个字符
  2. Shell Glob 的反向字符类

    • POSIX 标准 使用 !(如 [!abc] 表示不匹配 abc
    • GNU Bash 扩展 允许使用 ^(如 [^abc]
  3. 扩展的 extglob 语法

    • ?(pattern-list)*(pattern-list)+(pattern-list)仅在 Korn shell 和 Bash(启用 shopt -s extglob)中可用
    • 默认 Shell(如 Zsh)不支持,需要手动启用

适用工具

  • 标准 POSIX Shell(支持一般 glob 语法)
  • Korn Shell(Ksh)
  • GNU Bashextglob 需要 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 扩展)

这些正则表达式语法和工具在不同的环境下提供了不同程度的灵活性,选择正确的工具可以提高文本处理和自动化任务的效率。

最后修改: 2025年01月30日 星期四 02:25