輕鬆上手Regex與grep,sed,awk(一)
一些廢話:
對於Regex,一直都是似懂非懂,看到一些代碼,指令碼中帶有正則,awk,sed,心裡總有點虛。主要是記不住,平時又沒怎麼用,也就沒總結了。現在有空,決定總結一下,順便克服一下看到shell,js這些帶有正則就心虛的弱點。打算分三篇文章來寫
本文:
一般來說,正則分好幾種,但基本都差不多,我所瞭解的有 “基本正則”,“擴充正則“及”perl正則”,本文更偏向說記錄“基本正則”和“擴充正則”,它們在grep,egrep,sed,awk中發揮著重要發作用。
開始正則前,先複習一下grep的一些常用參數:
-n ,顯示行號,-v, 反向選擇-i,忽略大小寫
下面來始抄書了,參考《鳥哥的Linux私房菜.基礎學習篇 》,先下載我們要用的文本:
http://linux.vbird.org/linux_basic/0330regularex/regular_express.txt
內容如下:
先來學習”基本Regex“
1.直接匹配
例1.分別找出含apple和is 的文本
這應該是最簡單的使用正則了
2.方括弧[]
[]主要是進行集合方面的匹配,用法我們還是用例子說明
例2匹配含有test,tast的文本
可以看出,[]就是從集合[ae]中選出一個一個來匹配
3.方括弧[]與中橫線-結合
對於想匹配含有一個數位文本,我們可以寫成[0123456789],但這樣難免太麻煩,這就需要中橫線了對於數字,可以寫成[0-9], 同樣,對於字母也可以應用上來,大寫字母[A-Z],小寫字母[a-z],也可以合在一塊,如大小寫字母[a-zA-Z].
例3,找出含有數位文本
4.方括弧[] ,-,^,三者結合
在[]中出現^表示取反,舉例說明
例4.取出帶有oo,但oo前不含g的文本
最後一個”19:goooooogle yes!”為什麼會匹配上呢?雖然前面是goo,明顯不滿足,但是, go(oo)oogle,是滿足的,所以匹配上了。這也許就是正則的痛點之一,你寫出的正則或許存在bug,但你還沒發現。
例5, 匹配帶有oo,的文本,但oo前不含小寫字母
看到了吧,這就是[],-,^共同使用,注意:^在[]內才表示取反。
5.^與$
這裡又出現了^,但與上面的不一樣,這裡的^表示行首,相應的$就表示行尾。
例6 取出以the 開頭的文本
例7 取出以數字或字母結尾的文本
例8取出空行
空行用’^$’進行匹配
6.點號. 與星號*
點號.表示有且僅有一個任一字元
星號表示重複前一個0個或多個字元
例9匹配形如g??d的字串(gd之間有兩個字元)
如結果所示,點號.是表示一個任一字元。
例10 匹配至少連續兩個o以上的字元。
注意到這裡,”*”的意義與我們所認識的萬用字元*是不一樣的。
例11匹配g開頭g結尾的文本
用’g*g’ 是不行的,因為*和萬用字元是不一樣,正確的是’g.*g’
所以,記住,Regex的*和萬用字元的 *不一樣!
7.轉義\
如果我們想匹配的文本正好是代表一些特殊字元(《鳥哥的linux私房菜》中說是在shell中有特殊函義,我認為是不正確的,或者說讓人誤解,只是 shell中的嗎?比如他舉的例子點號,在shell中代表的是本目錄吧?其實真正的原因是.是正則表達字元吧?),該如何?轉義!
如匹配以點號 . 結尾的文本,我們知道.在Regex中表示匹配且僅匹配任意一個字元,所以可以用’\.$’
今天就先寫到基本的Regex吧。
參考資料:
《鳥哥的Linux私房菜》
《Linux程式設計》
http://www.ibm.com/developerworks/cn/education/aix/au-unixtips3/
http://www.cnblogs.com/chengmo/archive/2010/10/10/1847287.html