正則表達式是一種處理字符串的方法,是一組具有一定性質的字符串的描述,我自己認爲正則表達式就是字符串的模板。
在Linux中,正則表達式以行爲單位進行字符串的進行處理,通過一些特殊字符串的輔助,可以讓用戶輕易達到查找、刪除和替換某指定字符串的處理程序。
按照嚴謹程度,可以分爲基礎正則表達式和擴展正則表達式。我們一般使用的是基礎正則表達式,不過爲了更簡單地完成複雜的字符串處理動作,就要使用擴展正則表達式。
基礎正則表達式:
特殊符號 | 代表意義 |
[:alnum:] | 英文大小寫字符及數字 0-9 A-Z a-z |
[:alpha:] | 英文字符 A-Z a-z |
[:digit:] | 數字 0-9 |
[:lower:] | 小寫英文字符 a-z |
[:upper:] | 大寫英文字符 A-Z |
[:blank:] | 空格、Tab |
[:punct:] | 標點符號 " ' ? ! ; : # $ |
[:space:] | 任何會產生空白的字符,空格、Tab、CR |
[:print:] | 任空格符(空格鍵和Tab)外的其他所有按鍵 |
[:xdigit:] | 十六進制數字類型 0-9 A-F a-f |
[:cntrl:] | 鍵盤上面的控制按鍵 CR LF TAB DEL |
^ | 一行的開頭 |
$ | 一行的結束 |
* | 前一個字符出現0次會多次 |
. | 任意字符 |
[list] | 表示其中一個 有且僅有一個 括號內的元素爲or的關係 例如[abcd]爲abcd中的一個 |
\ | 轉義字符 例如在正則表達式中.代表任意字符,若果要找出含有點的行該怎麼辦? \. |
[n1-n2] | 字符範圍 強調的是範圍 根據編碼方式,位置在n1和n2的字符中的一個。 [A-Z] |
[^list] | 反向選擇 例如 不包含abc的一行 [^abc] |
{n,m} [n], {n,} | 對前面字符(組)的次數範圍的限定 a{2,5} a出現2-5次, a{2} a出現2次, a{2,} a出現2次或2次以上 |
擴展正則表達式
特殊符號 |
代表意義 |
+ |
前面的一個字符出現一次或多次 一次以上 |
? |
前面的字符出現0次或一次 |
| |
或(or) abc|bcd |
() |
組字符串 glad或good g(la|oo) |
()+ |
括號中的字符串出現一次或多次 例 A(xyz)+C 可匹配的字符串有AxyzC AxyzxyzC等 |
注:
- 在正則表達式中 ! 不是特殊符號,並不表非!的意思。
- ( ) 是對字符串來說,而 [ ] 是對單個字符來說,例如找出A和C之間含有abcd任一字符的行,則正則表達式可表示爲A[abcd]C。而找出A和C之間含有abcd或efgh這兩種字符串時,正則表達式爲A(abcd|efgh)
- 使用 [ ] 表示的當然也能夠使用()和|表示,只是 | 的每一個元素是一個字符,而不是一個字符串。
- | 可以表示兩個字符串的或,例如找出含有glad或me的行,正則表達式爲glad|me
- 正則表達式與shell下的通配附是兩碼事,正則表達式有自己的特殊符號,shell的通配符也有自己的特殊符號,有時兩者含有相同的特殊符號但是意思卻不一樣,例如在shell的通配符中*表示任意多個任意字符,而在正則表達式中*表示前面的字符出現0次或多次。有時,在兩者中意思一樣,但使用的特殊符號不同,例如,在shell中使用?表示必須存在的任意字符,但在正則表達式中 . 表示任意字符。當然也有使用相同符號表示相同含義的,例如\表示轉義字符。
特殊符號 |
代表意義 |
# |
批註符號,常用在shell script中 |
\ |
轉義字符 |
: |
連續執行命令的分隔符(與管道分隔符不同) |
~ |
用戶的主文件夾 |
$ |
使用變量前導符,用來表示一個變量 |
& |
作業控制,將命令變成背景下工作 |
! |
邏輯非 |
/ |
路徑分隔符 |
>,>> |
數據流重定向,輸出導向 |
<,<< |
數據流重定向,輸入導向 |
‘ ’ |
單引號,不具有變量置換的功能 |
“ ” |
雙引號,具有變量置換的功能 |
` ` |
反單引號,可以先執行的命令,也可使用$() |
( ) |
中間爲子shell的起始與結束 |
{ } |
中間爲命令塊的組合 |
通配符 |
代表意義 |
* |
0到無窮多個任意字符 |
? |
有且僅有一個任意字符 |
[ ] |
有且僅有一個括號內的字符 |
[-] |
有且僅有一個在編碼順序內的所有字符 |
[^] |
反向選擇,^表示非得意思 |