相关文章推荐

Shell里的正则表达式

在Unix系统的使用中经常会进行文本处理,不可变避免的会经常使用正则表达式,但在Unix里实际上有两种正则表达式——BRE(Basic Regular Expression)和ERE(Extended Regular Expression),这将是本文主要介绍的内容。

正则表达式

  • 字符集 [: :] 将关键字括起来的为POSIX字符集
  • 排序符号 指将多个字符视为一个单位,使用 [. .] 括起来,其在系统使用的locale上各有其定义
  • 等价字符集 指出视为等值的一组字符,用 [= =] 括起
  • 这三种构造都必须必须在方括号括表达式中使用,如: [[:alpha:]] 匹配任一个英文字母字符

    POSIX字符集

  • 在方括号表达式中所有其他的meta字符失去其特殊含义,故 [*\.] 将匹配于字面上的星号、反斜杠以及点号。对于 ]- 加入集合, ] 只能放在最前面, - 只能放在最前面或者最后面,如: []*.] []*.-]
  • 另外POSIX指出,NUL字符(数值零,即C语言的 '\0' 也即 NULL )不需要匹配。另有个别工具程序不许使用 . 点号meta字符或者方括号表达式来进行换行字符的匹配
  • 后向引用: \(...\) \n 结合起来使用的功能
  • BRE运算符优先级,由高到低
  • 匹配单个字符时,ERE本质上与BRE一致。一个较有名的例外是在awk中,其 \ 符号在方括号表达式内表示转意,因此要想匹配左方括号、连字符、右方括号或是反斜杠,应该使用 [\[\-\]\\]
  • ERE里没有后向引用
  • | 交替,或,其优先级最低,如: ab|cd|ef 将匹配 ab cd ef
  • 分组 () 提供分组功能,如 ((read|write)[[:space:]]*)+ 表示匹配多个连续的read和write其中可能有空格分隔
  • 在ERE中 ^ $ 永远有效,如 ab^cd ef$gh 虽然不会匹配到任何东西,但是表达式有效,使用本意需转意。
  • ERE运算符优先级,由高到低
  •  
    推荐文章