摘要:
1、正則元字符
2、[0-9]\{3\}-[0-9]\{2\}-[0-9]\{4\}
3個數(shù)字-2個數(shù)字-4個數(shù)字
3、ab(oratorie)?s
匹配labs或者laboratories,可以用于全稱或者縮寫的匹配
4、egrep "(^| )[\"[{(]*book[\"]})?!.;:'s]*( |$)"
bookwords
文本中搜索book,允許帶有復(fù)數(shù),但是不包括其他單詞
6、sed
's/\([0-9][0-9]*\)\.\{5,\}\([0-9][0-9]*\)\
/\1-\2/'
sample
將兩個數(shù)字中間超過5個點換成-
1、概述
在bash執(zhí)行環(huán)境中,我們講到了通配符的用法。這里要注意的是,正則表達(dá)式與shell腳本內(nèi)置的通配符不同,shell通配符主要用于對文件名展開,
因此是很簡單的一種正則;而這里要講解的正則表達(dá)式在grep,sed,awk等工具中經(jīng)常用到,可以做非常強(qiáng)大的匹配操作。想要系統(tǒng)了解正則表達(dá)式的同
學(xué),建議學(xué)習(xí)《sed與awk》的第三章。
2、元字符
一個正則表達(dá)式包括了普通字符集和元字符,元字符又包括錨(比如表示開頭和結(jié)尾)和修飾符(用于擴(kuò)展或縮小匹配范圍)。元字符列舉如下:
星號
-- * --
匹配前一個字符的任意多次(包括零次).
"1133*"匹配11
+ 一個或更多的3 + 可能的其他字符: 113, 1133, 111312, 等等.
點
-- . --
匹配除了新行符之外的任意一個字符. [1]
"13." 匹配13 +
至少一個任意字符(包括空格): 1133, 11333, 但不匹配 13(因為少了附加的至少一個任意字符).
脫字符
-- ^ --
匹配一行的開頭,但依賴于上下文環(huán)境,可能在正則表達(dá)式中表示否定
一個字符集的意思.
美元符
-- $ --
在正則表達(dá)式中匹配行尾.
"^$"
匹配空行.
方括號
-- [...] --
在正則表達(dá)式中表示匹配括號中的一個字符.
"[xyz]"
匹配字符x, y, 或z.
"[c-n]"
匹配從字符c到n之間的任意一個字符.
"[B-Pk-y]"
匹配從B到P 或從k到y(tǒng)的任意一個字符.
"[a-z0-9]"
匹配任意小寫字母或數(shù)字.
"[^b-d]"
匹配除了從b到d范圍內(nèi)所有的字符. 這是正則表達(dá)式中反轉(zhuǎn)意思或取否的一
個例子.(就好像在別的情形中!字符所扮演的角色).
多個方括號字符集組合使用可以匹配一般的單詞和數(shù)字模式."[Yy][Ee][Ss]"
匹配yes,
Yes, YES, yEs, 等等.
"[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]"匹配社會安全碼(Social
Security number).
反斜杠字符 -- \ -- 轉(zhuǎn)義(escapes)
一個特殊的字符,使這個字符表示原來字面上的意思.
"\$"表示了原來的字面意思"$",而不是在正則表達(dá)式中表達(dá)的匹配行尾的意思.同樣,"\\"也被解釋成了字面上的意思"\".
轉(zhuǎn)義(escape)"尖角號" --
\<...\> -- 用于表示單詞的邊界.
尖角號必須被轉(zhuǎn)義,因為不這樣做的話它們就表示單純的字面意思而已.
"\"
匹配單詞"the",但不匹配"them", "there", "other",等等.
以上都是基本的元字符,還有一些擴(kuò)展的元字符,在egrep,awk等工具中使用。
問號
-- ? --
匹配零或一個前面的字符. 它一般用于匹配單個字符.
加號
-- + --
匹配一個或多個前面的字符.它的作用和*很相似,但唯一的區(qū)別是它不匹配零個字符的情況.
1 # GNU 版本的
sed 和 awk 可以使用"+",
2 #
但它應(yīng)該轉(zhuǎn)義一下.
3
4 echo a111b
| sed -ne '/a1\+b/p'
5 echo a111b
| grep 'a1\+b'
6 echo a111b
| gawk '/a1+b/'
7 #
上面三句都是等價的效果.
8
9 # 多謝,
S.C.
轉(zhuǎn)義"大括號" -- \{ \} --
指示前面正則表達(dá)式匹配的次數(shù).
要轉(zhuǎn)義是因為不轉(zhuǎn)義的話大括號只是表示他們字面上的意思.這個用法只是技巧上的而不是基本正則表達(dá)式的內(nèi)容.
"[0-9]\{5\}" 精確匹配5個數(shù)字 (從 0 到 9的數(shù)字).
注意:
大括號不能在“經(jīng)典”(不是POSIX兼容)的正則表達(dá)式版本的awk中使用.
然而, gawk 有一個選項--re-interval來允許使用大括號(不必轉(zhuǎn)義).
bash$ echo 2222 | gawk
--re-interval '/2{3}/'
2222
Perl和一些egrep版本不要求轉(zhuǎn)義大括號.
圓括號
-- ( ) --
括起一組正則表達(dá)式. 它和下面要講的"|"操作符或在用expr進(jìn)行子字符串提取(substring
extraction)一起使用很有用.
豎線
-- | --
"或"正則操作符用于匹配一組可選的字符.
bash$ egrep
're(a|e)d' misc.txt
People who
read seem to be better informed than those who do
not.
The
clarinet produces sound by the vibration of its
reed.
還有一類POSIX字符類.
[:class:]
是另一種用于指定匹配字符范圍的方法.
[:alnum:]
匹配字母和數(shù)字.等同于A-Za-z0-9.
[:alpha:] 匹配字母.
等同于A-Za-z.
[:blank:]
匹配一個空格或是一個制表符(tab).
[:cntrl:]
匹配控制字符.
[:digit:] 匹配(十進(jìn)制)數(shù)字.
等同于0-9.
[:graph:] (可打印的圖形字符). 匹配 ASCII
碼值的33 - 126之間的字符. 這和下面提到的[:print:]一樣,但是不包括空格字符.
[:lower:] 匹配小寫字母.
等同于a-z.
[:print:] (可打印字符). 匹配 ASCII碼值
32 - 126之間的字符. 這和上面提到的[:graph:]一樣,但是增多一個空格字符.
[:space:] 匹配空白字符
(空格符和水平制表符).
[:upper:] 匹配大寫字母.
等同于A-Z.
[:xdigit:] 匹配十六進(jìn)制數(shù)字.
等同于0-9A-Fa-f.
注意:
POSIX字符類一般都要求用引號或是雙方括號double brackets ([[ ]])引起來.
bash$ grep
[[:digit:]] test.file
abc=723
這些字符類在一個受限的范圍內(nèi)甚至可能用在shell通配(globbing)中.
bash$ ls -l
?[[:digit:]][[:digit:]]?
-rw-rw-r-- 1
bozo bozo
0 Aug 21
14:47 a33b
3、正則表達(dá)式舉例
chapter.
匹配chapter后面跟任意字符,不包括chapter出現(xiàn)在行尾。
[Ww]hat
匹配What和what,也匹配somewhat
\.H[12345]
匹配.H1 , .H2 , .H3 , .H4 , .H5
[cC]hapter [1-9]
匹配chapter 9 , Chapter 1
[A-Za-z][.?!]
任意字母后跟.?!
[0-1][0-9][-/][0-3][0-9][-/][0-9][0-9]
MM-DD-YY或MM/DD/YY
\.DS "[^1]"
避免匹配.DS"1"
"*hyper"*
不論是否有"",hyper都被匹配
.*
匹配所有
<.*>
匹配帶<>
can[no']*t
匹配can't , can not ,cannot , cant等
80[234]?86
匹配8086 ,
80286 , 80386 ,80486
^$
匹配空行
^.*$
匹配所有行
11*0
匹配10 , 110, 1111110等
[0-9]\{3\}-[0-9]\{2\}-[0-9]\{4\}
3個數(shù)字-2個數(shù)字-4個數(shù)字
UNIX|LINUX
匹配UNIX或LINUX
lab(oratorie)?s
匹配labs或者laboratories,可以用于全稱或者縮寫的匹配
egrep "(^| )[\"[{(]*book[\"]})?!.;:'s]*( |$)"
bookwords
文本中搜索book,允許帶有復(fù)數(shù),但是不包括其他單詞
A.*Z
匹配最長情況
"[^"]*"
匹配最短的""內(nèi)容
sed
's/\([0-9][0-9]*\)\.\{5,\}\([0-9][0-9]*\)\
/\1-\2/'
sample
將兩個數(shù)字中間超過5個點換成-