正則表達式與Linux通配符
阿新 • • 發佈:2018-10-04
路徑 避免 沒有 abc 字母 數字 取數據 中間 lin
正則表達式與通配符
- 正則表達式用來在文件中匹配符合條件的字符串,正則是包含匹配。grep、awk、sed
等命令可以支持正則表達式。
- 通配符用來匹配符合條件的文件名,通配符是完全匹配。ls、find、cp這些命令不支
持正則表達式,所以只能使用shell自己的通配符來進行匹配。
Linux通配符
通配符是由shell處理的(不是由所涉及到命令語句處理的,其實我們在shell各個命令
中也沒有發現有這些通配符的介紹),它只會出現在命令的“參數”裏。shell會將其當作
路徑或文件名去在磁盤上搜尋可能的匹配;若符合要求的匹配存在,則進行代換;否則
就將該通配符作為一個普通字符傳遞給命令,然後再由命令進行處理。
總之,通配符實際上就是一種shell實現的路徑擴展功能,在通配符被處理後,shell會
先完成該命令的重組,然後再繼續處理重組後的命令,直至執行該命令。
shell常見通配符
字符 | 含義 | 實例 |
---|---|---|
* | 匹配0個或多個字符 | a*b a與b之間可以有任意長度的任意字符,也可以一個也沒有,例如aabcb,axyzb |
? | 匹配任意一個字符 | a?b a與b之間必須也只能有一個字符,可以是任意字符,例如:aab,acb,a0b |
[list] | 匹配list中的任意一個字符 | a[xyz]b a與b之間必須也只能有一個字符,但只能是list中的,例如:axb,ayb,azb |
[!list] | 匹配非list中的任意一個字符 | a[!0-9] a與b之間必須也只能有一個字符,但不能是list中,例如:axb,acb,a-b |
[c1-c2] | 匹配c1-c2中的任意一個字符 | a[0-9] 在c1到c2間匹配一個字符 |
{string1,string2,...} | 匹配string1或string2其一字符串 | a{abc,xyz,123}b a與b之間只能是{}中的字符串。 |
註:通配符看起來有點像正則表達式語句,但是它與正則表達式不同,不能相互混淆。
把通配符理解為shell特殊代號字符就可。而且涉及的只有:*,?,[],{},這幾種。
基礎正則表達式
元字符 | 作用 |
---|---|
* | 前一個字符匹配0次或任意多次 |
. | 匹配除了換行符外任意一個字符 |
^ | 匹配行首。例如:^hello會匹配以hello開頭的行。 |
$ | 匹配行尾。例如:hello$會匹配以hello結尾的行。 |
[] | 匹配方括號中指定的任意一個字符,制匹配一個字符。例如:[aoeiu]匹配任意一個元音字母,[0-9]匹配任意一位數字,[a-z][0-9]匹配小寫字字母和一位數字構成的 兩位字符。 |
[^] | 匹配除方括號中字符以外的任意一個字符。例如:[^0-9]匹配任意一位非數字字符。[^a-z]表示任意一位非小寫字母。 |
\ | 轉義符。用於取消特殊符號的含義。 |
\{n\} | 表示前面的字符恰好出現n次。例如:[0-9]\{4\}匹配4位數字。 |
\{n,\} | 表示其前面的字符出現不小於n次。例如:[0-9]\{2,\}表示兩位及以上的數字。 |
\{n,m\} | 表示其前面的字符至少出現n次,最多出現m次。例如:[a-z]\{6,m\}匹配6到8位的小寫字母。 |
語系對正則表達式的影響
由於不同語系的編碼表不同,所以會造成我們獲取數據的差異。例如:
LANG = C :0 1 2 3 4 5 ... A B C D E ..... Z a b c d e ....z
LANG = zh_TW.big5 : 0 1 2 3 4 5 ..... A a B b C c D d ...Z z
此時 ,如果你想要獲取大寫字母而實用[A-Z]時,LANG = C會很容易取出大寫字母(因為碼表A-Z是連續的,中間並沒有其他字符),而對zh_TW.big5,會發現 a - z 也同樣被取出來了。這是因為對於LANG = zh_TW.big5 編碼a - z 是混在A- Z中間的。所以,在使用正則表達式時,一定要留意語系問題!
為避免語系對正則表達式的幹擾,應盡量使用正則表達式所提供的特殊字符 :
正則表達式與Linux通配符