30分鐘帶你玩轉正則表達式正則表達式
定義:shell
正則表達式說白了就是有普通字符、以及特殊字符組成的文子模式。{匹配模式標準}vim
正則表達式將會做爲一個模板與所搜索的字符串進行匹配。可讓使用者輕易達到搜尋/刪除/取代某些特定字符的處理程序。此外vim、grep、find、awk、sed等命令都支持正則表達式編輯器
注:在這裏但願你們搞明白一件事,那就是通配符和正則表達式的區別與關係:ide
1、正則表達式是用來匹配字符串的,這個就不解釋了
2、通配符是用來通配的,也就是shell在作Pathname Expansion時用到的工具
那麼在什麼狀況下使用呢?測試
在什麼地方使用通配符?答案是隻要是shell命令行或者shell腳本中,你均可以使用通配符spa
在什麼地方使用正則表達式?當你使用可以支持正則表達式的工具軟件進行字符串處理時你就可使用正則表達式命令行
1、經常使用的正則表達式:3d
1)、 . 表明任意單個字符;如要查看某行中的put,可使用p.t 文件名與之相互匹配。
2)、 ^號表明開始;如以T開頭的行進行匹配.
3)、$表明行的結束;如以tty結束的行進行匹配:
4)、[...]匹配括號中的字符之一。可是隻要有和方括號內的字符相同將會所有匹配:
如[tty] 匹配包含tty其中之一字符或者所有包括
注:數字或者大小寫字符和上面的都是相同的道理這裏不在演示,有興趣你們能夠本身進行測試。
5)、[^xx]這個表示把某個字符或者數字排除在外的匹配,相似與取反的操做:
6)、 * 用於修飾前導字符,表示前導字符出現0次或任意屢次,*表明全部和前導字符相同的字符。如:
7)、\?一樣用於修飾前導字符,表示前導字符出現0次或者1次
8)、\+修飾前導字符,表示前導字符出現1次或者屢次
這三種方式的使用方式基本同樣,但就是前導字符出現的次數有所不一樣,上面已經標明瞭次數
9)、\{n,m\}一樣用於修飾前導字符,可是在這裏的n和m表示的是出現的次數,而不是個數,但願你們千萬不要混淆。好比匹配連續2到4個a
注意了:在這裏換可使用其餘的兩種方式進行顯示結果:
方式一:
方式二:
這裏使用的三種方式進行顯示,可是呢,都是進行了轉譯以後才能夠的到想要的結果。egrep就屬於轉譯,另外grep -E也是轉譯,最後a\{2,4\}也是轉譯,無論使用那種方式,均可以獲得想要的結果,
\ 用於轉義緊跟其後的單個特殊字符,使該特殊字符成爲普通字符
在這裏這個不作深刻的研究。
另外還有其餘的幾種形式:
\{n\} 連續的n個前導字符
\{n,\} 連續的至少n個前導字符
不知道上面的你們夥有沒有看明白,若是要是沒有看明白的話這裏將會爲你們繼續講解一個綜合的例子但願你們能夠看的更加明白一些:
Christian Scott lives here and will put on a Christmas party.
There are around 30 to 35 people invited.
They are:
Tom
Dan
Rhonda Savage
Nicky and Kimerly.
Steve, Suzanne, Ginger and Larry.
搜索行以A至Z的一個字母開頭,而後跟兩個任意字母,而後跟一個換行符的行。將找到第5行。
搜索以一個大寫字母開頭,後跟0個或多個小寫字母,再跟數字3,再跟0—5之間的一個數字。
搜索以0個或多個空格開頭,跟一個大寫字母,兩個小寫字母和一個換車符
將查找以0個或多個大寫或小寫字母開頭,不跟逗號,而後跟0個或多個大寫或小寫字母,而後跟一個換車符。
2、grep命令的用法:
相信你們以前多多少少以前對grep都有過了解和使用,好比截取,再或者結合管道符、重定向符號進行使用,那麼今天就讓你們對grep有一個更深如層次的瞭解;
grep(全面搜索正則表達式並把行打印出來)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打印出來.
你們能夠經過grep --help幫助來查看關於grep的更多參數命令,在這裏就爲你們介紹其中經常使用的幾種:
-A NUM,--after-context=NUM 除了列出符合行以外,而且列出後NUM行。
-B NUM,--before-context=NUM 與 -A NUM 相對,但這此參數是顯示除符合行以外並顯示在它以前的NUM行
-C [NUM], -NUM, --context[=NUM] 列出符合行以外並列出上下各NUM行,默認值是2
-i,--ignore-case 忽略大小寫差異
-n,--line-number 在匹配的行前面打印行號
-v,--revert-match 反檢索,只顯示不匹配的行
要用好grep這個工具,其實就是要寫好正則表達式,因此這裏不對grep的全部功能進行實例講解,只列幾個例子,講解一個正則表達式的寫法。
$ ls -l | grep '^d'
經過管道過濾ls -l輸出的內容,只顯示以d開頭的行。
$grep '\.$' filename
顯示以.爲結尾的全部行。
總結grep:
這幾個參數不在進行演示了相信你們已經明白了grep的基本用法了,可是grep的參數選項可不止這一點點,若是想要掌握更多的參數,就要學會查看幫助--help再或者查看man手冊
3、sed的用法:
sed是一種在線編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲「模式空間」(pattern space),接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下一行,這樣不斷重複,直到文件末尾。
注意:雖然sed把處理的內容發送到了屏幕之上,可是文件自己的內容卻並無改變,若是要想改變最簡單的方法就是使用參數【-i】便可。另外也能夠重定向到其餘文件之下。
sed的基本命令:
1)、替換:s命令
這是最爲經常使用的命令
好比:
爲啥有一個people沒有被替換掉呢?
那是由於sed 's/people/aaaaa/g' test.text沒有加g
2)用 & 表示匹配的字符串
有時可能會想在匹配到的字符串周圍或附近加上一些字符 .
如: sed 's/abc/(abc)/' filename
該例子在找到的 abc 先後加上括號 .
該例子還能夠寫成 sed 's/abc/(&)/' filename
下面是更復雜的例子 :
取得eno16777736網卡IP地址:
3)、刪除行:d命令
從某個文件當中刪除包含關鍵字符的全部行:
將/etc/passwd的內容顯示並找印行號,同時將2~5刪除
不知道你們對正則表達式有沒有認識和了解,今天就爲你們帶來這些,另外這些東西是看不會的,要多實操才能夠幫助你們加深印象和理解的。若是有什麼地方須要和本人交流請留言。
下次爲你們帶來更加複雜的awk命令