正則表達式(Regular expression)是一種符號表示法,被用來識別文本模式。git
最近在學習正則表達式,今天整理一下其中的一些知識點正則表達式
grep 是個很強大的程序,用來找到文件中的匹配文本。這樣使用 grep 命令:shell
grep pattern [file...]
當 grep 遇到一個文件中的匹配」模式」,它會打印出包含這個類型的行。(可使用正則表達式)express
grep 程序以這樣的方式來接受選項和參數:bash
grep [options] regex [file...]
選項 | 描述 |
---|---|
-i | 忽略大小寫。不會區分大小寫字符。也可用--ignore-case 來指定。 |
-v | 不匹配。一般,grep 程序會打印包含匹配項的文本行。這個選項致使 grep 程序只會打印不包含匹配項的文本行。也可用--invert-match 來指定。 |
-c | 打印匹配的數量(或者是不匹配的數目,若指定了-v 選項),而不是文本行自己。 也可用--count 選項來指定。 |
-l | 打印包含匹配項的文件名,而不是文本行自己,也可用--files-with-matches 選項來指定。 |
-L | 類似於-l 選項,可是隻是打印不包含匹配項的文件名。也可用--files-without-match 來指定。 |
-n | 在每一個匹配行以前打印出其位於文件中的相應行號。也可用--line-number 選項來指定。 |
-h | 應用於多文件搜索,不輸出文件名。也可用--no-filename 選項來指定。 |
正則表達式元字符由如下字符組成:學習
^ $ . [ ] { } - ? * + ( ) | \
圓點字符,其被用來匹配任意字符。若是咱們在正則表達式中包含它, 它將會匹配在此位置的任意一個字符。spa
在正則表達式中,插入符號和美圓符號被看做是錨點。這意味着正則表達式 只有在文本行的開頭或末尾被找到時,纔算發生一次匹配。code
grep -h '^zip' dirlist*.txt #以zip開頭的文件 $ grep -h 'zip$' dirlist*.txt #以zip結尾的文件 $ grep -h '^zip$' dirlist*.txt #名字爲zip的文件
除了可以在正則表達式中的給定位置匹配任意字符以外,經過使用中括號表達式, 咱們也可以從一個指定的字符集合中匹配單個字符。經過中括號表達式,咱們可以指定 一個待匹配字符集合(包含在不加中括號的狀況下會被解釋爲元字符的字符)。orm
若是在中括號表示式中的第一個字符是一個插入字符(^),則剩餘的字符被看做是不會在給定的字符位置出現的 字符集合。ip
插入字符若是是中括號表達式中的第一個字符的時候,纔會喚醒否認功能;不然,它會失去 它的特殊含義,變成字符集中的一個普通字符。
[A-Z]
表示A到Z全部字母
[A-Za-z0-9]
表示全部大小寫字母和0-9數字
字符集 | 說明 |
---|---|
[:alnum:] | 字母數字字符。在 ASCII 中,等價於:[A-Za-z0-9] |
[:word:] | 與[:alnum:]相同, 但增長了下劃線字符。 |
[:alpha:] | 字母字符。在 ASCII 中,等價於:[A-Za-z] |
[:blank:] | 包含空格和 tab 字符。 |
[:cntrl:] | ASCII 的控制碼。包含了0到31,和127的 ASCII 字符。 |
[:digit:] | 數字0到9 |
[:graph:] | 可視字符。在 ASCII 中,它包含33到126的字符。 |
[:lower:] | 小寫字母。 |
[:punct:] | 標點符號字符。在 ASCII 中,等價於:[-!"#$%&'()*+,./:;<=>?@[\]_`{|}~] |
[:print:] | 可打印的字符。在[:graph:]中的全部字符,再加上空格字符。 |
[:space:] | 空白字符,包括空格、tab、回車、換行、vertical tab 和 form feed.在 ASCII 中, 等價於:[ \t\r\n\v\f] |
[:upper:] | 大寫字母。 |
[:xdigit:] | 用來表示十六進制數字的字符。在 ASCII 中,等價於:[0-9A-Fa-f] |
經過改變環境變量 LANG 的值,你能夠選擇讓你的系統使用傳統的(ASCII)排列規則這個 LANG 變量包含了語種和字符集。這個值最初由你安裝 Linux 系統時所選擇的安裝語言決定。
locale LANG=zh_CN.UTF-8 LC_CTYPE="zh_CN.UTF-8" LC_NUMERIC=zh_CN.UTF-8 LC_TIME=zh_CN.UTF-8 LC_COLLATE="zh_CN.UTF-8" LC_MONETARY=zh_CN.UTF-8 LC_MESSAGES="zh_CN.UTF-8" LC_PAPER=zh_CN.UTF-8 LC_NAME=zh_CN.UTF-8 LC_ADDRESS=zh_CN.UTF-8 LC_TELEPHONE=zh_CN.UTF-8 LC_MEASUREMENT=zh_CN.UTF-8 LC_IDENTIFICATION=zh_CN.UTF-8 LC_ALL=
把這個 LANG 變量設置爲 POSIX,來更改 locale,使其使用傳統的 Unix 行爲。
export LANG=POSIX
經過把這條語句添加到你的.bashrc 文件中,可使這個更改永久有效。
BRE 能夠辨別如下元字符:
^ $ . [ ] *
ERE 添加了如下元字符(以及與其相關的功能):
( ) { } ? + |
添加 alternation,以豎槓線元字符爲標記
grep -Eh '^(bz|gz|zip)' dirlist*.txt
這個表達式將會在咱們的列表中匹配以「bz」,或「gz」,或「zip」開頭的文件名。
echo "(555) 123-4567" | grep -E '^\(?[0-9][0-9][0-9]\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$' (555) 123-4567
像 ? 元字符同樣,這個 * 被用來表示一個可選的字符
與 ? 不一樣,匹配的字符能夠出現 任意屢次,不只是一次。
[[:upper:][:lower:] ]*
元字符的做用與 * 很是類似,除了它要求前面的元素至少出現一次匹配。
限定符 | 意思 |
---|---|
{n} | 匹配前面的元素,若是它確切地出現了 n 次。 |
{n,m} | 匹配前面的元素,若是它至少出現了 n 次,可是很少於 m 次。 |
{n,} | 匹配前面的元素,若是它出現了 n 次或多於 n 次。 |
{,m} | 匹配前面的元素,若是它出現的次數很少於 m 次。 |
元 字 符 | 說明 |
---|---|
* | 0個或多個匹配 |
+ | 1個或多個匹配(等於{1,}) |
? | 0個或1個匹配(等於{0,1}) |
{n} | 指定數目的匹配 |
{n,} | 很多於指定數目的匹配 |
{n,m} | 匹配數目的範圍( m不超過255) |