1.什麼是Regex 在做文文書處理或編寫程式時,用到
尋找、替換等功能,
使用Regex能夠簡單快捷的完成目標。簡單而言,Regex通過一些特殊符號的協助,使使用者可以輕鬆快捷的完成尋找、刪除、替換等處理常式。例如
grep, expr, sed , awk. 或 Vi 中經常會使用到Regex,為了充分發揮 shell 編程的威力,需要精通Regex。正規標記法基本上是一種『標記法』, 只要工具程式支援這種標記法,那麼該工具程式就可以用來作為正規標記法的字串處理之用。 也就是說,例如 vi, grep, awk ,sed 等等工具,因為她們有支援正規標記法, 所以,這些工具就可以使用正規標記法的特殊字元來進行字串的處理。
首先是Regex的特殊符號:
[:alnum:]代表英文大小寫字母及數字 [:alpha:]代表英文大小寫字母[:blank:]代表空格和 tab 鍵[:cntrl:]鍵盤上的控制按鍵,如 CR,LF,TAB,DEL[:digit:]代表數字[:graph:]代表空白字元以外的其他[:lower:]小寫字母[:print:]可以被列印出來的任何字元[:punct:]代表標點符號[:upper:]代表大寫字元[:space:]任何會產生空白的字元如空格,tab,CR 等[:xdigit:]代表 16 進位的數字類型
執行個體:找出檔案中的所有大寫字母
$ grep -n '[[:lower:]]' regular_express.txt
2.語系對Regex的影響 ANG=C 時: 0 1 2 3 4....ABCDE...Zabcde...z LANG=zh_CN 時:0 1 2 3 4...aAbBcCdD.....zZ
在使用Regex[A-Z]時, LANG=C 的情況下,找到的僅僅是大寫字元 ABCD..Z。而在 LANG=zh_CN 情況下,會選取到 AbBcCdD.....zZ 字元。因此在使用Regex時要特別留意語系。
由於我們一般使用的相容與 POSIX 的標準,因此使用 C 語系。
3.grep命令與Regex 1.搜尋特定字串“the”: 參數說明:
-a :將 binary 檔案以 text 檔案的方式搜尋資料
-c :計算找到 '搜尋字串' 的次數
-i :忽略大小寫不同,所以大小寫視為相同
-n :順便輸出行號
-v :反向選擇,亦即顯示出沒有 '搜尋字串' 內容的那一行。
$ grep -n 'the' regular_express.txt$ grep -in 'the' regular_express.txt
2.字串匹配 []中包含的任意一個字元。只能是一個。
字元“ - ”來表示一個範圍
[^...] 排除型字元組。排除後面的字元
[abc] :表示“a”或“b”或“c”[0-9] :表示 0~9 中任意一個數字,等價於[0123456789][\u4e00-\u9fa5] :表示任意一個漢字[^a1<] :表示除“a”、“1”、“<”外的其它任意一個字元[^a-z] :表示除小寫字母外的任意一個字元
尋找“tast”或者“test”兩個字串。# grep -n 't[ae]st' regular_express.txt 尋找不包含“#”的字串# grep -n '[^#]' regular_express.txt
$ grep -n 'oog' regular_express.txt$ grep -n '[^g]oog' regular_express.txt $ grep -n '[^go]oog'regular_express.txt
行首符號:^
$ grep -n '^the' regular_express.txt
尋找行首為大寫字母的所有行:
# grep -n '^[A-Z]' regular_express.txt
行尾符號:$ 尋找以 d 字母結尾的行:
# grep -n 'd$' regular_express.txt
尋找空行:
$ grep -n '^$' regular_express.txt
查看/etc/insserv.conf 文檔
'^$' : 過濾掉空白行
'^#' :過濾掉注釋行(以#號開頭)
$ cat -n /etc/insserv.conf$ grep -v '^$' /etc/insserv.conf | grep -v '^#'
3.任意一個字元:. 重複字元:*
尋找 a。ou。類型的字元。
$ grep -n 'a.ou.' regular_express.txt
*(星號):代表重複前面 0 個或者多個字元。e*: 表示具有Null 字元或者一個以上 e 字元。ee*,表示前面的第一個 e 字元必須存在。第二個 e 則可以是 0 個或者多個 e 字元。eee*,表示前面兩個 e 字元必須存在。第三個 e 則可以是 0 個或者多個 e 字元。ee*e :表示前面的第一個與第三個 e 字元必須存在。第二個 e 則可以是 0 個或者多個 e 字元。
4.限定連續字元的範圍{}
{ }可限制一個範圍區間內的重複字元數。舉個例子,若要找出 2~5 個 o 的連續字串,如何做。 此時便要用到{}了。由於 { 與 } 在 shell 中有特殊意義,需要用到逸出字元\。
尋找連續的兩個 o 字元:
$ grep -n 'o\{2\}' regular_express.txt
總結:^word 表示帶搜尋的字串(word)在行首word$ 表示帶搜尋的字串(word)在行尾.(小數點) 表示 1 個任一字元\ 表示逸出字元,在特殊字元前加\會將特殊字元意義去除* 表示重複 0 到無窮多個前一個 RE(Regex)字元[list] 表示搜尋含有 l,i,s,t 任一字元的字串[n1-n2] 表示搜尋指定的字串範圍,例如[0-9] [a-z] [A-Z]等[^list] 表示反向字串的範圍,例如[^0-9]表示非數字字元,[^A-Z]表示非大寫字元範圍\{n,m\} 表示找出 n 到 m 個前一個 RE 字元\{n,\} 表示 n 個以上的前一個 RE 字元
4.Regex運用之sed工具命令 通過Regex和 sed 工具簡單快捷的完成檔案查詢、修改等功能。
sed工具介紹: sed 是非互動編輯器。它不會修改檔案,除非使用 shell 重新導向來儲存結果。預設情況下,所有的輸出行都被列印到螢幕上。
sed 編輯器逐行處理檔案(或輸入),並將結果發送到螢幕。具體過程如下:首先 sed 把當前正在處理的行儲存在一個臨時緩衝區中(也稱為模式空間),然後處理臨時緩衝區中的行,完成後把該行發送到螢幕上。sed 每處理完一行就將其從臨時緩衝區刪除,然後將下一行讀入,進行處理和顯示。處理完輸入檔案的最後一行後,sed 便結束運行。sed 把每一行都存在臨時緩衝區中,對這個副本進行編輯,所以不會修改原檔案。
如果要修改原檔案,可使用-i 選項。 1.將 regular_express.txt 的內容列出並列印行號,同時,將 2-5 行刪除顯示:
$ nl regular_express.txt | sed '2,5d'
注: sed 是 sed -e 的簡寫, 後接單引號
2.刪除第三行到最後一行, $定位到最後一行
刪除第三行到最後一行, $定位到最後一行
3.原檔案中刪除第 1 行
$ sed -i '1d' regular_express.txt
4.在第二行後添加 test 字串
$ nl regular_express.txt | sed '2a test'
5.在第二行前添加 test 字串
$ nl regular_express.txt | sed '2i test'
6.在第二行後加入兩行 test,“\n”表示分行符號
$ nl regular_express.txt | sed '2a test\ntest'
7.替換
$ nl regular_express.txt | sed '2,5c No2-5number'
8.列出需要的幾行
$ nl regular_express.txt |sed -n '5,7p'
9.替換字串
sed 's/被替換字串/新字串/g'
5.擴充Regex 事實上,一般實驗者只需要熟悉基礎的Regex就足夠了。不過有時候為了簡化命令操作,瞭解一些使用範圍更廣的擴充運算式,會更加方便。
簡單對比:
$ grep -v '^$' regular_express.txt |grep -v '^#'$ egrep -v '^$|^#' regular_express.txt
+ :表示重複一個或一個以上的前一個 RE 字元
$ egrep -n 'go+d' regular_express.txt$ grep -n 'goo*d' regular_express.txtgod good
() :表示找出群組字串
$ egrep -n 'g(la|oo)d' regular_express.txt也就是搜尋(glad)或 good 這兩個字串