——《鳥哥的私房菜》git
正規表示法就是處理字串的方法,他是以行爲單位來進行字串的處理行爲;
正規表示法透過一些特殊符號的輔助,可讓使用者輕易的達到『搜尋/刪除/取代』某特定字串的處理程序;
只要工具程序支持正規表示法,那麼該工具程序就能夠用來做爲正規表示法的字串處理之用;
正規表示法與萬用字節是徹底不同的東西!萬用字節 (wildcard) 表明的是 bash 操做介面的一個功能, 但正規表示法則是一種字串處理的表示方式!shell
grep 正規表示法裏面是很常見也很經常使用的一個工具,他最重要的功能就是進行字串數據的比對,而後將符合使用者需求的字串列印出來。express
grep 在數據中查尋一個字串時,是以 "整行" 爲單位來進行數據的擷取的!也就是說,假如一個文件內有 10 行,其中有兩行具備你所搜尋的字串,則將那兩行顯示在螢幕上,其餘的就丟棄了!bash
grep [-acinv] [-A] [-B] [--color=auto] '搜尋字符串' filename
選項與參數:
-a :將 binary 文件以 text 文件的方式搜尋數據
-c :計算找到 '搜尋字符串' 的次數
-i :忽略大小寫的不一樣,因此大小寫視爲相同
-n :順便輸出行號
-v :反向選擇,亦即顯示出沒有 '搜尋字符串' 內容的那一行
--color=auto :將找到的關鍵詞部分加上顏色的顯示
-A :後面可加數字,爲 after 的意思,除了列出該行外,後續的 n 行也列出來
-B :後面可加數字,爲 befer 的意思,除了列出該行外,前面的 n 行也列出來工具
基礎正規表示法字符彙整編碼
RE 字符 | 意義與範例 |
^word | 意義:待搜尋的字串(word)在行首! 範例:搜尋行首爲 # 開始的那一行,並列出行號 grep -n '^#' regular_express.txt |
word$ | 意義:待搜尋的字串(word)在行尾! 範例:將行尾爲 ! 的那一行列印出來,並列出行號 grep -n '!$' regular_express.txt |
. | 意義:表明『必定有一個任意字節』的字符! 範例:搜尋的字串能夠是 (eve) (eae) (eee) (e e), 但不能僅有 (ee) !亦即 e 與 e 中間『必定』僅有一個字節,而空白字節也是字節! grep -n 'e.e' regular_express.txt |
\ | 意義:跳脫字符,將特殊符號的特殊意義去除! 範例:搜尋含有單引號 ' 的那一行! grep -n \' regular_express.txt |
* | 意義:重複零個到無窮多個的前一個 RE 字符 範例:找出含有 (es) (ess) (esss) 等等的字串,注意,由於 * 能夠是 0 個,因此 es 也是符合帶搜尋字串。另外,由於 * 爲重複『前一個 RE 字符』的符號, 所以,在 * 以前必需要緊接著一個 RE 字符喔!例如任意字節則爲 『.*』 ! grep -n 'ess*' regular_express.txt |
[list] | 意義:字節集合的 RE 字符,裏面列出想要擷取的字節! 範例:搜尋含有 (gl) 或 (gd) 的那一行,須要特別留意的是,在 [] 當中『謹表明一個待搜尋的字節』, 例如『 a[afl]y 』表明搜尋的字串能夠是 aay, afy, aly 即 [afl] 表明 a 或 f 或 l 的意思! grep -n 'g[ld]' regular_express.txt |
[n1-n2] | 意義:字節集合的 RE 字符,裏面列出想要擷取的字節範圍! 範例:搜尋含有任意數字的那一行!需特別留意,在字節集合 [] 中的減號 - 是有特殊意義的,他表明兩個字節之間的全部連續字節!但這個連續與否與 ASCII 編碼有關,所以,你的編碼須要配置正確(在 bash 當中,須要肯定 LANG 與 LANGUAGE 的變量是否正確!) 例如全部大寫字節則爲 [A-Z] grep -n '[A-Z]' regular_express.txt |
[^list] | 意義:字節集合的 RE 字符,裏面列出不要的字串或範圍! 範例:搜尋的字串能夠是 (oog) (ood) 但不能是 (oot) ,那個 ^ 在 [] 內時,表明的意義是『反向選擇』的意思。 例如,我不要大寫字節,則爲 [^A-Z]。可是,須要特別注意的是,若是以 grep -n [^A-Z] regular_express.txt 來搜尋,卻發現該文件內的全部行都被列出,爲何?由於這個 [^A-Z] 是『非大寫字節』的意思, 由於每一行均有非大寫字節,例如第一行的 "Open Source" 就有 p,e,n,o.... 等等的小寫字 grep -n 'oo[^t]' regular_express.txt |
\{n,m\} | 意義:連續 n 到 m 個的『前一個 RE 字符』 意義:若爲 \{n\} 則是連續 n 個的前一個 RE 字符, 意義:如果 \{n,\} 則是連續 n 個以上的前一個 RE 字符! 範例:在 g 與 g 之間有 2 個到 3 個的 o 存在的字串,亦即 (goog)(gooog) grep -n 'go\{2,3\}g' regular_express.txt注:由於 { 與 } 的符號在 shell 是有特殊意義的,所以, 咱們必需要使用跳脫字符 \ 來讓他失去特殊意義才行 |
再次強調:『正規表示法的特殊字節』與通常在命令列輸入命令的『萬用字節』並不相同, 例如,在萬用字節當中的 * 表明的是『 0 ~ 無限多個字節』的意思,可是在正規表示法當中, * 則是『重複 0 到無窮多個的前一個 RE 字符』的意思~使用的意義並不相同,不要搞混了!spa
舉例來講,不支持正規表示法的 ls 這個工具中,若咱們使用 『ls -l * 』 表明的是任意檔名的文件,而 『ls -l a* 』表明的是以 a 爲開頭的任何檔名的文件, 但在正規表示法中,咱們要找到含有以 a 爲開頭的文件,則必需要這樣:(需搭配支持正規表示法的工具)ci
ls | grep -n '^a.*'字符串
.* 就表明零個或多個任意字節it
另外,那個 ^ 符號,在字節集合符號(括號[])以內與以外是不一樣的! 在 [] 內表明『反向選擇』,在 [] 以外則表明定位在行首的意義!
例如:grep -n '^[^a-zA-Z]' 意義是 不要開頭是英文字母的行
另外,爲了要避免編碼所形成的英文與數字的擷取問題,所以有些特殊的符號咱們得要了解一下的! 這些符號主要有底下這些意義:
特殊符號 | 表明意義 |
[:alnum:] | 表明英文大小寫字節及數字,亦即 0-9, A-Z, a-z |
[:alpha:] | 表明任何英文大小寫字節,亦即 A-Z, a-z |
[:blank:] | 表明空白鍵與 [Tab] 按鍵二者 |
[:cntrl:] | 表明鍵盤上面的控制按鍵,亦即包括 CR, LF, Tab, Del.. 等等 |
[:digit:] | 表明數字而已,亦即 0-9 |
[:graph:] | 除了空白字節 (空白鍵與 [Tab] 按鍵) 外的其餘全部按鍵 |
[:lower:] | 表明小寫字節,亦即 a-z |
[:print:] | 表明任何能夠被列印出來的字節 |
[:punct:] | 表明標點符號 (punctuation symbol),亦即:" ' ? ! ; : # $... |
[:upper:] | 表明大寫字節,亦即 A-Z |
[:space:] | 任何會產生空白的字節,包括空白鍵, [Tab], CR 等等 |
[:xdigit:] | 表明 16 進位的數字類型,所以包括: 0-9, A-F, a-f 的數字與字節 |