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运算符优先级,由高到低