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 对匹对方式是以行为单位的,所以匹对出的 freedom 和 GNU 必须在同一行。
这里是一个对规则表达式中的变字符的一个归纳:
- .
- 对应出换行符 (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 中文计划