鍍金池/ 教程/ Linux/ shell 學習第八天---擴展正則表達式(ERE)
shell 學習四十五天---xargs
shell學習第三天
shell 學習十五天---join 連接字段
shell 學習第二天
shell 學習四十三天---臨時性文件的建立與使用
shell 學習第六天---小結(jié)
shell 學習三十三天---關(guān)于重定向
shell 學習二十九天---循環(huán)
shell 學習二十四天---提取開頭或結(jié)尾數(shù)行
shell 學習第十天---sed 查找與替換
shell 學習第十一天---sed 正則的精確控制
shell 學習三十天---break,continue,shift,getopts
shell 學習---小結(jié)
shell 學習三十一天---函數(shù)問題
shell 學習第四天---華麗的 printf 輸出
shell 學習三十五天---波浪號展開與通配符
shell 學習十九天---文本塊排序
shell 學習十二天---行與字符串
shell 學習二十一天---重新格式化段落
shell 學習十八天---文本排序
shell 學習十三天---sed 案例分析
shell 學習四十一天---列出文件 ls 和 od 命令
shell 學習十七天---awk 命令
shell 學習三十六天---命令替換
shell 學習十六天---join 練習
shell 學習三十二天---read 讀取一行
shell 學習二十二天---計算行數(shù),字數(shù)以及字符數(shù)
shell 學習小總結(jié)---本章小結(jié)
shell 學習第八天---擴展正則表達式(ERE)
shell 學習四十二天---使用 touch 更新文件時間
shell 學習二十八天---case 語句
shell 學習三十九天---內(nèi)建命令
shell 學習第一天
shell 學習三十四天---printf 詳解
shell 學習二十六天---變量與算數(shù)
shell 學習三十八天---執(zhí)行順序和 eval
shell 學習四十四天---尋找文件
shell 學習二十五天---神器的管道符
shell 學習十四天---使用 cut 選定字段
shell 學習第五天---基本的I/O重定向
shell 學習四十天---awk 的驚人表現(xiàn)
shell 學習二十天---sort 的其他內(nèi)容以及 uniq 命令
shell 學習二十三天---打印
shell 學習第九天---分組
shell 學習四十八天---文件校驗和匹配
shell 學習二十七天---退出狀態(tài)和 if 語句
shell 學習四十七天---文件比較 cmp,diff,patch
shell 學習第七天---基礎(chǔ)正則表達式(BRE)
shell 學習四十六天---文件系統(tǒng)的空間信息 df 和 du 命令
shell 學習三十七天---引用
shell 學習小結(jié)

shell 學習第八天---擴展正則表達式(ERE)

擴展正則表達式(ERE)

擁有筆記本正則表達式更多的功能。BRE 與 ERE 在大多數(shù)的 meta 字符與功能應用上幾乎是完全一致,單 ERE 理由寫 meta 字符看起來與 BRE 類似,卻具有完全不同的類型。

擴展正則表達式與基礎(chǔ)正則表達式的唯一區(qū)別在于:? + () {} 這幾個字符。

基礎(chǔ)正則表達式中,如果你想? + () {}表示特殊含義,你需要將他們轉(zhuǎn)義
而擴展正則表達式中,如果你想? + () {} 不表示特殊含義,你需要將他們轉(zhuǎn)義。

轉(zhuǎn)義符號,都是一樣的,\符號。
所謂特殊含義,就是正則表達式中的含義。非特殊含義,就是這個符號本身。

例如
[root@shellcn.net ~#] echo aaa|grep 'a?';[root@shellcn.net ~#] echo aaa|grep 'a\?';aaa#egrep 使用的是擴展正則表達式[root@shellcn.net ~#] echo aaa|egrep 'a?';aaa[root@shellcn.net ~#] echo aaa|egrep 'a\?';

可見,擴展正則表達式與基礎(chǔ)正則表達式的區(qū)別,就是它們加不加轉(zhuǎn)義符號,代表的意思剛好相反。

ERE 歷史沒有后向引用的。圓括號在ERE里具有特殊含義,但和 BRE 里使用的又有所不同。在ERE里, \ ( 與 \ )匹配的是字面上的左括號與右括號。

匹配單個表達式與多個正則表達式
ERE 在匹配多字符這方面,與 BRE 有明顯的不同,不過在(*)的處理上和 BRE 是相同的。

注意:有一個例外,*作為 ERE 的第一個字符是“未定義的”,而在 BRE 中它是指“符合字面的”。
一般情況下使用 grep 控制 BRE,使用 egrep 控制 ERE。
使用 ERE 匹配我們之前介紹過的離子“要剛好重現(xiàn) 5 個 a”以及“重現(xiàn) 10 個至 42 個 q”,寫法分別為:a{5},q{10,42}。而{與}則可以匹配字面上的花括號。當在 ERE 里{找不到匹配}時,POSIX 特意保留其含義為“未定義狀態(tài)”。

ERE 另有兩個 meta 字符,可更細膩的處理匹配控制:
? 匹配于 0 個或一個前置正則表達式
+ 匹配于一個或多個前置正則表達式
可以把?想象成是“可選用的”,也就是說,匹配前置正則表達式的文,要么出現(xiàn),要么沒出現(xiàn)。例如:與 ab?c 匹配的有 ac 與 abc,就這兩者 ! (與 ab*c 相較之下,后者匹配于中間有人一個 b)。

+字符在概念上與* meta字符類似,不過前置正則表達式要匹配的文本在這里至少得出現(xiàn)一次。例如ab+c匹配于 abc,abbc,abbbc,但是不匹配于 ac。

ab+c的正則表達式等價于 abbc;無論如何,當前值正則表達式很復雜時,使用+可以少打一點字,這就減少了打錯字的幾率。

交替

方括號運算符一宇表示“匹配于次祖父,或其他字符,或...”,但不能指定“ 匹配于這個序列,或其他序列”。要達到后者的目的,可以使用管道運算符 ( | )。例如read | write匹配于 read 與 write 兩者,fast|slow匹配于 fast 與 slow。
| 字符是 ERE 運算符;i 優(yōu)先級最低的。