本文主要說一些正則的基本語法,並且結合linux的各種小工具(egrep、sed、awk)列舉一些使用實例。
一、基本語法
正則的基本語法就大概是下面這些,但是正則遠不止這些,甚至可以寫一本書,當然了,我們這裏只列舉一些簡單的
用法,這些已經可以解決大部分實際問題了。
1、字符類
字符 | 含義 | 舉例 |
---|---|---|
.
|
匹配任意一個字符 |
abc.
可
以匹配abcd
、abc9
等 |
[]
|
匹配括號中的任意一個字符 |
[abc]d
可以匹配ad
、bd
或cd
|
-
|
用在[]中,表示字符範圍 |
[0-9a-fA-F]
可以匹配一位十六進制數字 |
^
|
如果位於[]的開頭,則匹配除去括號中字符之外的一切字符 |
[^xy]
匹配除xy
之外的任一字符,因此[^xy]1
可以
匹配a1
、b1
但不匹配x1
、y1
|
[[:xxx:]]
|
grep
工
具預定義的一些命名字符類 |
[[:alpha:]]
匹配一個字母,[[:digit:]]
匹配一個數字 |
2、數量限定符
字符 | 含義 | 舉例 |
---|---|---|
?
|
緊跟在它前面的單元匹配零次或一次 |
[0-9]?/.[0-9]
匹配0.0
、2.3
、.5
等,由於.
在正則表達式中是一個特殊字符,所以需要用/
轉
義一下,取字面值 |
+
|
緊跟在它前面的單元匹配一次或多次 |
[a-zA-Z0-9.-_]+@[a-zA-Z0-9.-_]+/.[a-zA-Z0-9.-_]匹配email
|
*
|
緊跟在它前面的單元匹配零次或多次 |
[0-9][0-9]*
匹配至少一位數字,等價於[0-9]+
,[a-zA-Z_]+[a-zA-Z_0-9]*
匹
配C語言的標識符 |
{N}
|
緊跟在它前
面的單元應精確匹配N次
|
[1-9][0-9]{2}
匹
配從100
到999
的整數 |
{N,}
|
緊跟在它前面的單元至少要匹配n次 |
[1-9][0-9]{2,}
匹配三位以上(含三位)的整數 |
{,M}
|
緊跟在它前面的單元至多匹配m次 |
[0-9]{,1}和[0-9]?意義一樣,
|
{N,M}
|
緊跟在它前面的單元至少匹配n次,至多匹配m次 |
[0-9]{1,3}/.[0-9]{1,3}/.[0-9]{1,3}/.[0-9]{1,3}/.用於匹配ip地址
|
3、位置限定符
字符 | 含義 | 舉例 |
---|---|---|
^
|
匹配行首的位置 | ^content匹配以content開頭的行
|
$
|
匹配行末的位置 | :$匹配以:結尾的行,^$匹配空行
|
/<
|
匹配單詞開頭的位 置 | /<th
匹配...
this
,但不匹配ethernet
、tenth
|
/>
|
匹 配單詞結尾的位置 | p/>
匹配leap ...
,但不匹配parent
、sleepy
|
/b
|
匹 配單詞開頭或結尾的位置 | ap/b匹配leap,/ble匹配leap,/bat/b
匹配... at ...
,但不匹配cat
、atexit
、batch
|
/B
|
匹配非單詞開頭和結尾的位置 | /Bat/B
匹配battery
,但不匹配... attend
、hat ...
|
4、其他特殊字符
字符 | 含義 | 舉例 |
---|---|---|
/
|
轉義字符,普通字符轉義爲特殊字符,特殊字符轉義爲普通字符 | 普
通字符<
寫成/<
表
示單詞開頭的位置,特殊字符.
寫成/.
以
及/
寫成//
就當作普通字符來
匹配 |
()
|
將正則表達式的一部分括起 來組成一個單元,可以對整個單元使用數量限定符 | ([0-9]{1,3}/.){3}[0-9]{1,3}
匹
配IP地址 |
|
|
連接兩個表達式,表示或的關係 |
n[o-either]可以匹配no或neither
|
二、小工具
1、grep/egrep
grep
是一種查找過濾工具,正則表達式在grep
中
用來查找符合模式的字符串。
egrep相當於grep -E,表示採用Extended正則表達式語法。grep的正則表達式有Basic和 Extended兩種規範
上述列舉的正則表達式語法都適用於egrep。而grep的語法則相對簡陋一些,?+(){}|都只是一些匹配字符了。
2、sed
sed意爲流編輯器(Stream Editor),在Shell腳本和Makefile中作爲過濾器使用非常普遍,也就是把前一個程序的輸出引入sed的輸入,經過一系列編輯命令轉換爲另一種格式輸出。sed和vi都源於早期UNIX的ed工具,所以很多sed命令和vi的末行命令是相同的。
在正常情況下,sed將待處理的行讀入模式空間,腳本中的命令就一條接着一條的對該行進行處理,直到腳本執行完畢,然後該行被輸出,模式空間清空;然後重複剛纔的動作,文件中的新的一行被讀入,直到文件處理完備。
看了很多寫sed的就屬鳥哥寫的最好了,摘錄一下:
不過鳥哥的不是很全,特補充如下:
-
n和p一起使用:$ sed -n 's/^test/mytest/p'
example
(-n)選項和p標誌一起使用表示只打印那些發生替換的行。也就是說,如果某一行開頭的test被替換成mytest,就打印
它。 - 引用:$ sed 's/^192.168.0.1/&localhost/' example-----&符號表示替換換字符串中被找到的部份。所有以192.168.0.1開頭的行都會被替換成它自已加 localhost,變成192.168.0.1localhost。
- 引用:$ sed -n 's//(love/)able//1rs/p' example-----love被標記爲1,所有loveable會被替換成lovers,而且替換的行會被打印出來。
- 分隔符:$ sed 's#10#100#g' example-----不論什麼字符,緊跟着s命令的都被認爲是新的分隔符,所以,“#”在這裏是分隔符,代替了默認的“/”分隔符。表示把所有10替 換成100。
- 用正則表示範圍:$ sed -n '/test/,/check/p' example-----所有在模板test和check所確定的範圍內的行都被打印。
- 正則和數字混用表示範圍:$ sed -n '5,/^test/p' example-----打印從第五行開始到第一個包含以test開始的行之間的所有行。
- $ sed '/test/,/check/s/$/sed test/' example-----對於模板test和west之間的行,每行的末尾用字符串sed test替換。
- 一次執行多條命令:$ sed -e '1,5d' -e 's/test/check/' example-----(-e)選項允許在同一行裏執行多條命令。如例子所示,第一條命令刪除1至5行,第二條命令用check替換test。命令的執 行順序對結果有影響。如果兩個命令都是替換命令,那麼第一個替換命令將影響第二個替換命令的結果。
- 並不常用的一種用法:$ sed '/test/{ n; s/aa/bb/; }' example-----如果test被匹配,則移動到匹配行的下一行,替換這一行的aa,變爲bb,並打印該行,然後繼續。
- h命令和G命令: $ sed -e '/test/h' -e '$G‘ example-----在sed處理文件的時候,每一行都被保存在一個叫模式空間的臨時緩衝區中,除非行被刪除或者輸出被取消,否則所有被處理的行都將 打印在屏幕上。接着模式空間被清空,並存入新的一行等待處理。在這個例子裏,匹配test的行被找到後,將存入模式空間,h命令將其複製並存入一個稱爲保 持緩存區的特殊緩衝區內。第二條語句的意思是,當到達最後一行後,G命令取出保持緩衝區的行,然後把它放回模式空間中,且追加到現在已經存在於模式空間中 的行的末尾。在這個例子中就是追加到最後一行。簡單來說,任何包含test的行都被複制並追加到該文件的末尾。
- 特殊字符"^"和"$"匹配的是模式空間的最開始與最末尾
- n: 將模式空間中的內容輸出,然後把下一行讀入模式空間
- sed '/test/{a;b;c}' 這個用法可以針對匹配test的行執行a、b、c這三天命令。
補充幾個除d、a、i、s、c、p之外不常用的命令:
- h:拷貝模板塊的內容到內存中的緩衝區。
- H:追加模板塊的內容到內存中的緩衝區
- g:獲得內存緩衝區的內容,並替代當前模板塊中的文本。
- G:獲得內存緩衝區的內容,並追加到當前模板塊文本的後面。sed G可以在每一行後面添加一個空白行,這是因爲當前內存緩衝區爲空,每次都把緩衝區的空內容添加到了每一行後面。
- sed '/^$/d;G':用分號分隔多條命令,每一條命令都會作用在當前行上。
更多用法可以參考:
http://sed.sourceforge.net/sed1line_zh-CN.html
http://blog.chinaunix.net/u2/89923/showart_2206200.html
http://www.tsnc.edu.cn/default/tsnc_wgrj/doc/sed.htm
3、awk
待續。。。。。。。