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

shell 學(xué)習(xí)第九天---分組

基本正則表達(dá)式中支持分組,而在擴展正則表達(dá)式中,分組的功能更加強大,也可以說才是真正的分組,用法如下:
():分組,后面可以使用\1 \2 \3...引用前面的分組
除了方便后面引用外,分組還非常方便的可以使用上述次數(shù)匹配方法進行匹配具有相同條件的數(shù)據(jù)。

如:grep '^(barlow).*\1' /etc/passwd 搜索/etc/passwd中以 barlow 開頭,而后面還存在 barlow 的行。

在BRE中,我們使用一些 meta 字符修飾前置字符,匹配重復(fù)的情況。但是這樣的操作僅僅針對單個字符。在 ERE 中,分組功能能夠計 meta 字符修飾前置字符串。一個針對字符,一個針對字符串。

在 ERE 里,我們已經(jīng)提到運算符是被應(yīng)用到“前置的正則表達(dá)式”。這是因為有圓方括號({...})提供分組功能,讓接下來的運算符可以應(yīng)用。例如 (why)+ 匹配于一個或連續(xù)重復(fù)的多個 why。
再例如:[Tt]he (CPU|computer) is 指的是:在 the(The)與 is 之間,含有 CPU 或 computer 的句子。特別注意:圓括號里的是 meta 字符,而非要匹配的輸入文本。由此看出用到交替的時候,分組特別有用。

例如(read|write)+指的是:有一個或重現(xiàn)多個 read,或者一個或重現(xiàn)多個 write。(read|write)+所指的字符串中間,不允許有空白。
當(dāng)將交替操作結(jié)合^與$錨點字符使用時,分組就非常好用了。由于 | 為所有運算符中優(yōu)先級最低的,因此正則表達(dá)式^abcd|efgh$意思是“匹配字符串的起始處是否具有 a b c d 或者字符串結(jié)尾是否具有 e f g h”(表示查找字符),這和^(abcd)|(efgh)$不一樣,后者的意思是“找一個正好是 abcd 或正好是 efgh 的字符串”

停駐文本匹配(錨點)
“^”與“$”在 ERE 和 BRE 表示的含義是相同的,需要注意的是他們在方括號表達(dá)式中將會失去他們的特殊意義;
組合使用,例如this is ^(one|two)$匹配 one 或者 two。在 ERE 里,^和$永遠(yuǎn)是 meta 字符。所以,像ab^cdef$gh這樣的正則表達(dá)式仍然是有效的,只是無法匹配到任何東西,因為^前面有其他的字符串,$后面也有字符串,失去了他們的特殊含義。

ERE運算符的優(yōu)先級

運算符 含義
[..] [= =] [: :] 用于字符對應(yīng)的方括號符號
\metacharacter 轉(zhuǎn)移的 meta 字符
[] 方括號表達(dá)式
() 分組
* + ? {} 重復(fù)潛質(zhì)的正則表達(dá)式
無符號(no symbol) 連續(xù)字符
^ $ 錨點
| 交替

正則表達(dá)式的擴展
最常見的擴展為 \<\>運算符,分別匹配“單詞(word)”的開頭與結(jié)尾,單詞是由字母,數(shù)字及下劃線組成的。我們稱這類字符為單詞組成。

例如:\<chop 匹配于 use chopsticks,但是 eat a lambchop 則不匹配;同樣的chop>\匹配與第二個字符串,第一個則不匹配。
特別注意:\<chop>\的表達(dá)式下,兩個字符串都不匹配。

額外的GNU正則運算符

運算符 含義
\w 匹配任何單詞組成字符
\W 匹配任何非單詞組成字符
\<\> 匹配單詞的起始和結(jié)尾
\b 匹配單的起始或結(jié)尾處所找到的空字符串/這是\<與>\運算符的結(jié)合。注意:由于 awk 使用\b 表示后退運算符,因此 GNU awk(gawk) 使用\y 表示此功能。
\B 匹配兩個單詞組成字符之間的空字符串
\’ `\ `` 分別匹配 emacs 緩沖區(qū)的開始與結(jié)尾。GNU 程序(wmacs)通常將他們是位^和$同義。

例子:'<!-\?[^-]\+'#<后面是!然后是 0~1 個-,最后是一個非-字符。