鍍金池/ 教程/ Linux/ shell 學(xué)習(xí)第八天----擴(kuò)展正則表達(dá)式 (ERE)
shell 學(xué)習(xí)四十一天----列出文件 ls 和 od 命令
shell 學(xué)習(xí)小結(jié)
shell 學(xué)習(xí)第二十八天----case 語(yǔ)句
shell 學(xué)習(xí)四十四天----尋找文件
shell 學(xué)習(xí)三十五天----波浪號(hào)展開(kāi)與通配符
shell 學(xué)習(xí)三十八天----執(zhí)行順序和 eval
shell 學(xué)習(xí)四十八天----文件校驗(yàn)和匹配
shell 學(xué)習(xí)四十天----awk 的驚人表現(xiàn)
shell 學(xué)習(xí)第十一天----sed 正則的精確控制
shell 學(xué)習(xí)第十七天----awk 命令
shell 學(xué)習(xí)三十九天----內(nèi)建命令
shell 學(xué)習(xí)四十五天----xargs
shell 學(xué)習(xí)三十七天----引用
shell 學(xué)習(xí)第十六天----join 練習(xí)
shell 學(xué)習(xí)第二十四天----提取開(kāi)頭或結(jié)尾數(shù)行
shell 學(xué)習(xí)第九天----分組
shell 學(xué)習(xí)第五天----基本的 I/O 重定向
shell 學(xué)習(xí)第十五天----使用 cut 選定字段
shell 學(xué)習(xí)四十六天----文件系統(tǒng)的空間信息 df 和 du 命令
shell 學(xué)習(xí)第八天----擴(kuò)展正則表達(dá)式 (ERE)
shell 學(xué)習(xí)第十九天----文本塊排序
shell 學(xué)習(xí)第二十一天----重新格式化段落
shell 學(xué)習(xí)三十六天----命令替換
shell 學(xué)習(xí)第二十天----sort 的其他內(nèi)容以及 uniq 命令
shell 學(xué)習(xí)四十二天----使用 touch 更新文件時(shí)間
shell 學(xué)習(xí)五十一天----top 命令查看進(jìn)程列表
shell 學(xué)習(xí)第一天
shell 學(xué)習(xí)五十四天----進(jìn)程系統(tǒng)調(diào)用的追蹤 strace
shell 學(xué)習(xí)五十天----查看進(jìn)程 ps 命令
shell 學(xué)習(xí)第二十七天----退出狀態(tài)和 if 語(yǔ)句
shell 學(xué)習(xí)第二十三天----打印
shell 學(xué)習(xí)三十三天----關(guān)于重定向
shell 學(xué)習(xí)四十九天----進(jìn)程建立
shell 學(xué)習(xí)第三十天----break,continue,shift,getopts
shell 學(xué)習(xí)五十五天----進(jìn)程記賬
shell 學(xué)習(xí)總結(jié)一
shell 學(xué)習(xí)第二十六天----變量與算數(shù)
shell 學(xué)習(xí)第二十二天----計(jì)算行數(shù), 字?jǐn)?shù)以及字符數(shù)
shell 學(xué)習(xí)五十八天----/proc 文件系統(tǒng)
shell 學(xué)習(xí)第二十五天----神器的管道符
shell 學(xué)習(xí)第三十二天----read 讀取一行
sheel 學(xué)習(xí)第三天
shell 學(xué)習(xí)----小結(jié)
shell 學(xué)習(xí)第十八天----文本排序
shell 學(xué)習(xí)第三十一天----函數(shù)問(wèn)題
shell 學(xué)習(xí)第十天----sed 查找與替換
shell 學(xué)習(xí)四十三天----臨時(shí)性文件的建立與使用
shell 學(xué)習(xí)四十七天----文件比較 cmp,diff,patch
shell 學(xué)習(xí)三十四天----printf 詳解
shell 學(xué)習(xí)五十七天 ----linux 任務(wù)管理,針對(duì)上一講的總結(jié)和擴(kuò)展
shell 學(xué)習(xí)第六天----小結(jié)
shell 學(xué)習(xí)第十三天----sed 案例分析
shell 學(xué)習(xí)第七天----基礎(chǔ)正則表達(dá)式 (BRE)
shell 學(xué)習(xí)第十二天----行與字符串
shell 學(xué)習(xí)小結(jié)四
shell 學(xué)習(xí)第二十九天----循環(huán)
shell 學(xué)習(xí)五十二天----刪除進(jìn)程 kill 命令
shell 學(xué)習(xí)五十六天----延遲進(jìn)程調(diào)度
shell 學(xué)習(xí)第四天----華麗的 printf 輸出
shell 學(xué)習(xí)第十五天----join 連接字段
shell 學(xué)習(xí)完結(jié)篇----希望你能看到
shell 學(xué)習(xí)第二天
shell 學(xué)習(xí)五十三天----捕獲信號(hào) trap

shell 學(xué)習(xí)第八天----擴(kuò)展正則表達(dá)式 (ERE)

擴(kuò)展正則表達(dá)式 (ERE)

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

擴(kuò)展正則表達(dá)式與基礎(chǔ)正則表達(dá)式的唯一區(qū)別在于:? + () {} 這幾個(gè)字符。基礎(chǔ)正則表達(dá)式中,如果你想? + () {} 表示特殊含義,你需要將他們轉(zhuǎn)義。而擴(kuò)展正則表達(dá)式中,如果你想? + () {} 不表示特殊含義,你需要將他們轉(zhuǎn)義。轉(zhuǎn)義符號(hào),都是一樣的,\ 符號(hào)。

所謂特殊含義,就是正則表達(dá)式中的含義。非特殊含義,就是這個(gè)符號(hào)本身。

例如

  • [root@shellcn.net ~#] echo aaa|grep 'a?';[root@shellcn.net ~#] echo aaa|grep 'a\?';aaa#egrep 使用的是擴(kuò)展正則表達(dá)式
  • [root@shellcn.net ~#] echo aaa|egrep 'a?';aaa[root@shellcn.net ~#] echo aaa|egrep 'a\?';

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

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

匹配單個(gè)表達(dá)式與多個(gè)正則表達(dá)式

ERE 在匹配多字符這方面,與 BRE 有明顯的不同,不過(guò)在 (*) 的處理上和 BRE 是相同的。

注意:

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

ERE 另有兩個(gè) meta 字符,可更細(xì)膩的處理匹配控制:

  • ? 匹配于 0 個(gè)或一個(gè)前置正則表達(dá)式
  • + 匹配于一個(gè)或多個(gè)前置正則表達(dá)式

可以把? 想象成是” 可選用的”,也就是說(shuō),匹配前置正則表達(dá)式的文本,要么出現(xiàn),要么沒(méi)出現(xiàn)。例如: 與 ab?c 匹配的有 ac 與 abc,就這兩者 ! (與 ab*c 相較之下,后者匹配于中間有人一個(gè) b)。

+ 字符在概念上與 *meta 字符類似,不過(guò)前置正則表達(dá)式要匹配的文本在這里至少得出現(xiàn)一次。例如 ab+c 匹配于 abc,abbc,abbbc,但是不匹配于 ac。ab+c 的正則表達(dá)式等價(jià)于 abbc; 無(wú)論如何,當(dāng)前值正則表達(dá)式很復(fù)雜時(shí),使用 + 可以少打一點(diǎn)字,這就減少了打錯(cuò)字的幾率。

交替

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