1 規則表達式 (Regular Expressions)

規則表達式是一組字符集合的描述。這個描述可以用來搜索一篇文章,尋找一段符合我們用規則表達式描述的文字。規則表達式類似於 shell 的通配符 (shell wildcards) (見第 6.6 頁第6.6 節),但是它更複雜,功能也更強大。

一段規則表達式是由文字和 變字符 (metacharacters) 組成的。一個變字符就是一個字符但是有特殊的意思。變字符包括:. * [] - \^ $。

如果一段規則表達式只含有文字(沒有變字符),那它就相對應那些文字。例如規則表達式 ``my regular expression'' 就匹對 ``my regular expression'',僅此而已。規則表達式一般是大小寫敏感的。

您可以用命令 egrep 顯示一個檔案中所有匹對一個規則表達式的行。語法是:

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

例如,要找到 GPL �堜狾釦t有 GNU 這個單詞的行,鍵入:

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

egrep 'freedom.*GNU' /usr/doc/copyright/GPL
這兒的 . 是指「所有字符」,而 * 指「0 或以上個前面的那個東西」,合起來就是「零或一個任意的字符」,因此 .* 基本上對應幾乎所有的文字。egrep 對匹對方式是以行為單位的,所以匹對出的 freedom 和 GNU 必須在同一行。

這�堿O一個對規則表達式中的變字符的一個歸納:

.
對應出換行符 (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。
\
這個變字符逃脫任何一個特殊字符。如果您想要搜索 * 這個字,您需要用 \*。這個斜杠的意思是忽略 * 的特殊意思。
這�堿O一些範例,讓您更好的掌握規則表達式的用法:
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 中文計劃