1 规则表达式 (Regular Expressions)

规则表达式是一组字符集合的描述。这个描述可以用来搜索一篇文章,寻找一段符合我们用规则表达式描述的文字。规则表达式类似于 shell 的通配符 (shell wildcards) (见第 6.6 页第6.6 节),但是它更复杂,功能也更强大。

一段规则表达式是由文字和 变字符 (metacharacters) 组成的。一个变字符就是一个字符但是有特殊的意思。变字符包括:. * [] - \^ $

如果一段规则表达式只含有文字(没有变字符),那它就相对应那些文字。例如规则表达式 ``my regular expression'' 就匹对 ``my regular expression'',仅此而已。规则表达式一般是大小写敏感的。

您可以用命令 egrep 显示一个文件中所有匹对一个规则表达式的行。语法是:

egrep 'regexp' filename1 ...
其中的单引号不是所有情况下都需要的,但最好加上。

例如,要找到 GPL 里所有含有 GNU 这个单词的行,键入:

egrep 'GNU' /usr/doc/copyright/GPL
egrep 会把那些行印在标准输出的。 如果您想要所有含有 freedom 后跟一些其它的字然后再跟 GNU 的行,可以用命令:

egrep 'freedom.*GNU' /usr/doc/copyright/GPL
这儿的 . 是指“所有字符”,而 * 指“0 或以上个前面的那个东西”,合起来就是“零或一个任意的字符”,因此 .* 基本上对应几乎所有的文字。egrep 对匹对方式是以行为单位的,所以匹对出的 freedomGNU 必须在同一行。

这里是一个对规则表达式中的变字符的一个归纳:

.
对应出换行符 (newline) 以外的所有单一字符。
*
对应 0 或以上个前面那个东西。比如表达式 a* 对应零或多个小写 a,而 .* 对应零或多个任意字符。
[字符字符字符]
括号内必须含有一个或以上的字符,整个括号表达式只对应给出的字符集合中的一个字符。例如 [abc] 对应一个 a,一个 b,或者一个 c;它不对应 0 字符,也不对应这三个字符以外的任何字符。
^
把您的搜查限制在每行的开头。表达式 ^The 对应一个在行首的 The;在这个 The 前面不能有空格或者任何其他的文字。如果您要允许有前面有空格,您可以用表达式 ^*The 来允许前面有 0 或多个空格。
$
把搜索限制在行尾。end$ 要求文字 end 出现在一行的最后,后面没有空格或其它。
[^字符字符]
这个表达颠倒一个括号字符表达式,即 [^abc] 对应所有除了 a、b、c 以外的单一字符。
[字符-字符]
您可以在括号表达式里包含一个范围。要对应所有小写字母,使用 [a-z]。其间可以使用多个范围,例如对应前三个和后三个英文字母,使用 [a-cx-z]。对应所有英文大小写字母,使用 [a-zA-Z]。您可以把范围,单个字母,以及 ^ 变字符混用,比如 [^a-zBZ] 对应“除了一个小写字母,大写 B,大写 Z 以外的所有单一东西”。
()
您可以用圆括号把一部分表达式结成一组,就像一般的数学表达式一样。
|
| 的意思是“或者”(or)。您可以用它来提供一系列的可选表达式。一般可选的表达式会用圆括号分开,像:c(ad|ab|at) 对应的是 cad 或 cab 或 cat。如果没有圆括号,则对应的就成了 cad 或 ab 或 at 了:cad|ab|at。
\
这个变字符逃脱任何一个特殊字符。如果您想要搜索 * 这个字,您需要用 \*。这个斜杠的意思是忽略 * 的特殊意思。
这里是一些范例,让您更好的掌握规则表达式的用法:
c.pe
对应 cope、cape、caper。
c\ .pe
对应 c.pe、c.per。
sto*p
对应 stp、stop、stoop。
car.*n
对应 carton、cartoon、carmen。
xyz.*
对应 xyz 和它后面跟的所有东西,有些工具,例如 egrep,只对应到那一行结束为止。
^The
对应一行开头的 The。
atime$
对应一行结尾的 atime。
^Only$
对应一个只含有 Only 一个字的行,没有空格,没有其它字符,别的什么都没有,就一个 Only。
b[aou]rn
对应 barn、born、burn。
Ver[D-F]
对应 VerD、VerE、VerF。
Ver[^0-9]
对应一个 Ver 后面跟任何非数字的东西。
the[ir][re]
对应 their、therr、there、theie。
[A-Za-z][A-Za-z]*
对应任何只含有英文字母的单词,并且最少有一个字母,不对应数字或空格。


John Goerzen / Ossama Othman / Debian 中文计划