2019年10月15日 星期二

延伸正規表示法 - 群組功能『 | 』管線意義為『或 or』

轉自  http://linux.vbird.org/linux_basic/0330regularex.php

延伸正規表示法 - 群組功能『 | 』管線意義為『或 or』

事實上,一般讀者只要瞭解基礎型的正規表示法大概就已經相當足夠了,不過,某些時刻為了要簡化整個指令操作, 瞭解一下使用範圍更廣的延伸型正規表示法的表示式會更方便呢!舉個簡單的例子好了,在上節的例題三的最後一個例子中,我們要去除空白行與行首為 # 的行列,使用的是
grep -v '^$' regular_express.txt | grep -v '^#'
需要使用到管線命令來搜尋兩次!那麼如果使用延伸型的正規表示法,我們可以簡化為:
egrep -v '^$|^#' regular_express.txt

延伸型正規表示法可以透過群組功能 | 』來進行一次搜尋!那個在單引號內的管線意義為『或 or』啦! 是否變的更簡單呢?此外,grep 預設僅支援基礎正規表示法,如果要使用延伸型正規表示法,你可以使用 grep -E , 不過更建議直接使用 egrep !直接區分指令比較好記憶!
其實 egrep 與 grep -E 是類似命令別名的關係啦!
熟悉了正規表示法之後,到這個延伸型的正規表示法,你應該也會想到,不就是多幾個重要的特殊符號嗎? ^_^y 是的~所以,我們就直接來說明一下,延伸型正規表示法有哪幾個特殊符號?由於底下的範例還是有使用到 regular_express.txt ,不巧的是剛剛我們可能將該檔案修改過了 @_@,所以,請重新下載該檔案來練習喔!

RE 字符意義與範例
+意義:重複『一個或一個以上』的前一個 RE 字符
範例:搜尋 (god) (good) (goood)... 等等的字串。 那個 o+ 代表『一個以上的 o 』所以,底下的執行成果會將第 1, 9, 13 行列出來。
egrep -n 'go+d' regular_express.txt
?意義:『零個或一個』的前一個 RE 字符
範例:搜尋 (gd) (god) 這兩個字串。 那個 o? 代表『空的或 1 個 o 』所以,上面的執行成果會將第 13, 14 行列出來。 有沒有發現到,這兩個案例( 'go+d' 與 'go?d' )的結果集合與 'go*d' 相同? 想想看,這是為什麼喔! ^_^
egrep -n 'go?d' regular_express.txt
|意義:用或( or )的方式找出數個字串
範例:搜尋 gd 或 good 這兩個字串,注意,是『或』! 所以,第 1,9,14 這三行都可以被列印出來喔!那如果還想要找出 dog 呢?
egrep -n 'gd|good' regular_express.txt
egrep -n 'gd|good|dog' regular_express.txt
()意義:找出『群組』字串
範例:搜尋 (glad) 或 (good) 這兩個字串,因為 g 與 d 是重複的,所以, 我就可以將 la 與 oo 列於 ( ) 當中,並以 | 來分隔開來,就可以啦!
egrep -n 'g(la|oo)d' regular_express.txt
()+意義:多個重複群組的判別
範例:將『AxyzxyzxyzxyzC』用 echo 叫出,然後再使用如下的方法搜尋一下!
echo 'AxyzxyzxyzxyzC' | egrep 'A(xyz)+C'
上面的例子意思是說,我要找開頭是 A 結尾是 C ,中間有一個以上的 "xyz" 字串的意思~

以上這些就是延伸型的正規表示法的特殊字元。另外,要特別強調的是,那個 ! 在正規表示法當中並不是特殊字元, 所以,如果你想要查出來檔案中含有 ! 與 > 的字行時,可以這樣:
grep -n '[!>]' regular_express.txt
這樣可以瞭解了嗎?常常看到有陷阱的題目寫:『反向選擇這樣對否? '[!a-z]'?』, 呵呵!是錯的呦~要 '[^a-z] 才是對的!至於更多關於正規表示法的進階文章,請參考文末的參考資料(註2)

沒有留言:

張貼留言