shell中的正則表達式和通配符
正則表達式
正則表達式包含以下一個或多個組成部分
字符集:一組字符
錨:表領(lǐng)了正則表達式在文本中要匹配的位置。例如^和$
修飾符:用于展開或者縮小正則表達式匹配文本行的范圍。例如*,(),\。
正則表達式主要的內(nèi)容
星號*
匹配前一個字符任意多次(含0)。
例如:“123*”表示匹配12+任意多次的3
點.
匹配除了換行以外的任意一個字符
例如:“12.”會匹配12+任意一個字符(包括空格),但不匹配12,因為這個位置少了一個字符
^
匹配一行的開頭。也有可能表示否定一個字符集。
$
匹配行尾。
因此可知“^$”可以用于匹配空行
方括號[]
表示匹配括號中的一個字符。
例如:
“[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)所有的字符. 這是正則表達式中反轉(zhuǎn)意思或取否的一個例子。
反斜杠\
轉(zhuǎn)義字符,使一個字符表示其字面上的意思。
尖角號(須轉(zhuǎn)義)\<\>
表示單詞的邊界。
例如:“\<the\>”會匹配單詞the,但是不會匹配them等。
正則表達式的擴展符號
問號?
匹配0個或者1個前面的字符
加號+
匹配1個或者多個前面的字符。與*相似,但是不匹配0個字符。
大括號\{\}(須轉(zhuǎn)義)
指示前面正則表達式的匹配的次數(shù)。
例如“[0-9]\{5\}”精確匹配5個數(shù)字。
圓括號()
括起一組正則表達式用于做或操作之類。
豎線|
或操作,用于匹配一組字符。
例如:
“(0-5) | (a-c)”會匹配一個0-5的數(shù)字或者a-c的字母。
POSIX字符類
[:alnum:] 匹配字母和數(shù)字.等同于A-Za-z0-9.
[:alpha:] 匹配字母. 等同于A-Za-z.
[:blank:] 匹配一個空格或是一個制表符(tab).
[:cntrl:] 匹配控制字符.
[:digit:] 匹配(十進制)數(shù)字. 等同于0-9.
[:graph:]
(可打印的圖形字符). 匹配 ASCII 碼值的33 - 126之間的字符. 這和下面提到的[:print:]一樣,但是不包括空格字符.
[:lower:] 匹配小寫字母. 等同于a-z.
[:print:] (可打印字符). 匹配 ASCII碼值 32 - 126之間的字符. 這和上面提到的[?:graph:?]
一樣,但是增多一個空格字符。
[:space:] 匹配空白字符 (空格符和水平制表符).
[:upper:] 匹配大寫字母. 等同于A-Z.
[:xdigit:] 匹配十六進制數(shù)字. 等同于0-9A-Fa-f.
通配符
Bash本身沒有正則表達式的功能.在腳本里,使用正則表達式的是命令和軟件包,例如sed和awk,它們可以解釋正則表達式.
Bash所做的是展開文件名擴展,這就是所謂的通配(globbing) ,但它不是使用標(biāo)準(zhǔn)的正則表達式. 而是使用通配符. 通配解釋標(biāo)準(zhǔn)的通配符:和?, 方括號括起來的字符,還有其他的一些特殊的字符(比如說^用來表示取反匹配).然而通配機制的通配符有很大的局限性. 包含有號的字符串將不會匹配以點開頭的文件,例如.bashrc另外,通配機制的? 字符和正則表達式中表示的意思不一樣.
通配符種類
星號*
匹配 0 或多個字符
問號?
匹配任意一個字符,但是必須有一個字符。
[list]
匹配 list 中的任意單一字符。注意只能有一個。
[!list]
匹配除了 list 中的任意單一字符。注意只能有一個。
[a-c]
匹配a到c的任一個字符
{string1,string2...}
匹配括號里面的任一個字符串。