Regular-Expression
FreeBSD 是否包含基本正則表達式的多種變體?
grep
並且sed
預設情況下都被描述為使用“基本正則表達式”(“BRE”)。BRE在這裡有很好的描述。但是考慮這個輸出:
# echo ' aaaaa ' | grep '\(aaaaa\|bbbbb\)' aaaaa # echo ' aaaaa ' | sed '/\(aaaaa\|bbbbb\)/ s/ /_/g' aaaaa
在第一個命令中,
\( ... \| ... \)
語法顯然是,(X OR Y)
因為輸出通過了grep
。在第二個命令中,
\( ... \| ... \)
語法顯然沒有充當,(X OR Y)
因為空格沒有更改為下劃線。(相比之下,兩個命令都被辨識
\+
為“一個或多個重複”)發生了什麼事?為什麼在 FreeBSD 中似乎有兩種 BRE,其中一種可以辨識另一種不能辨識的語法?
更深層次的問題是,許多項目著眼於 BRE 以提供對其他類 unix 系統的可移植性。但這表明即使 BRE 在各個平台之間也不可能相同,即使它們在各個平台中都不相同。啊?
連結文章中的描述是錯誤的。
實際的 POSIX 定義指出:
以非轉義 <反斜杠> ( ‘' ) 開頭的普通字元的解釋是未定義的,除了*[
(){}
、數字和括號表達式]*普通字元被定義為除 BRE 特殊字元
.[^$*
和反斜杠本身之外的任何字元。因此,與該頁面聲稱的不同,
\+
BRE 中未定義 ,\|
.一些正則表達式實現將它們定義為與 ERE 相同
+
,|
但尤其是 GNU 的。但是您不應該指望這一點,而是堅持定義的功能。當然,這裡的問題是
|
BRE 中根本不存在 ERE 交替運算符,而 ERE 的等價物+
非常醜陋(它是\{1,\}
)。因此,您可能想改用 ERE。