目錄
在看鳥哥的Linux私房菜的時候看到十二章一直強調萬用字元和正則表達式的區別,在我的理解中,兩者貌似是一樣的都是用來匹配的。Google之網上給出的答案是:
在文字過濾工具裡,都是用正則表達式,比如像awk,sed,等,是針對檔案的內容的
而萬用字元多用在檔名上,比如查詢find,ls,cp,等等
下表是鳥哥給的Linux下的萬用字元
符號 | 內容 |
* | 萬用字元,代表 0 個或多個字元(或數字) |
? | 萬用字元,代表『一定有』一個字母 |
# | 註解,這個最常被使用在 script 當中,視為說明! |
/ | 跳脫符號,將『特殊字元或萬用字元』還原成一般字元 |
| | 分隔兩個管線命令的界定; |
; | 連續性命令的界定(注意!與管線命令並不相同) |
~ | 使用者的家目錄 |
$ | 亦即是變數之前需要加的變數取代值 |
& | 將指令變成背景下工作 |
! | 邏輯運算意義上的『非』 not 的意思! |
/ | 路徑分隔的符號 |
>, >> | 輸出導向,分別是『取代』與『累加』 |
' | 單引號,不具有變數置換的功能 |
" | 具有變數置換的功能! |
` ` | 兩個『 ` 』中間為可以先執行的指令! |
( ) | 在中間為子 shell 的起始與結束 |
[ ] | 在中間為字元的組合 |
{ } | 在中間為命令區塊的組合! |
下表是鳥哥總結的正則表達式的字元
RE 字元 | 意義與範例 |
^word | 待搜尋的字串(word)在行首! |
範例:grep -n '^#' regular_express.txt 搜尋行首為 # 開始的那一行! |
|
word$ | 待搜尋的字串(word)在行尾! |
範例:grep -n '!$' regular_express.txt 將行尾為 ! 的那一行列印出來! |
|
. | 代表『任意一個』字元,一定是一個任意字元! |
範例:grep -n 'e.e' regular_express.txt 搜尋的字串可以是 (eve) (eae) (eee) (e e), 但不能僅有 (ee) !亦即 e 與 e 中間『一定』僅有一個字元,而空白字元也是字元! |
|
/ | 跳脫字元,將特殊符號的特殊意義去除! |
範例:grep -n /' regular_express.txt 搜尋含有單引號 ' 的那一行! |
|
* | 重複零個或多個的前一個 RE 字元 |
範例:grep -n 'ess*' regular_express.txt 找出含有 (es) (ess) (esss) 等等的字串,注意,因為 * 可以是 0 個,所以 es 也是符合帶搜尋字串。另外,因為 * 為重複『前一個 RE 字元』的符號, 因此,在 * 之前必須要緊接著一個 RE 字元喔!例如任意字元則為 『.*』 ! |
|
/{n,m/} | 連續 n 到 m 個的『前一個 RE 字元』 若為 /{n/} 則是連續 n 個的前一個 RE 字元, 若是 /{n,/} 則是連續 n 個以上的前一個 RE 字元! |
範例:grep -n 'go/{2,3/}g' regular_express.txt 在 g 與 g 之間有 2 個到 3 個的 o 存在的字串,亦即 (goog)(gooog) |
|
[] | 字元集合的 RE 特殊字元的符號 |
[list] 範例:grep -n 'g[ld]' regular_express.txt 搜尋含有 (gl) 或 (gd) 的那一行~ 需要特別留意的是,在 [] 當中『謹代表一個待搜尋的字元』, 例如: a[afl]y 代表搜尋的字串可以是 aay, afy, aly 亦即 [afl] 代表 a 或 f 或 l 的意思! [ch1-ch2] 範例:grep -n '[0-9]' regular_express.txt 搜尋含有任意數字的那一行!需特別留意,在字元集合 [] 中的減號 - 是有特殊意義的,他代表兩個字元之間的所有連續字元!但這個連續與否與 ASCII 編碼有關, 因此,您的編碼需要設定正確(在 bash 當中,需要確定 LANG 與 LANGUAGE 的變數是否正確!) 例如所有大寫字元則為 [A-Z] [^] 範例:grep -n 'oo[^t]' regular_express.txt 搜尋的字串可以是 (oog) (ood) 但不能是 (oot) ,那個 ^ 在 [] 內時, 代表的意義是『反向選擇』的意思~例如,我不要大寫字元,則為 [^A-Z] ~ 但是,需要特別注意的是,如果以 grep -n [^A-Z] regular_express.txt 來搜尋, 卻發現該檔案內的所有行都被列出,為什麼?因為這個 [^A-Z] 是『非大寫字元』的意思, 因為每一行均有非大寫字元,例如第一行的 "Open Source" 就有 p,e,n,o.... 等等的小寫字元, 以及雙引號 (") 等字元,所以當然符合 [^A-Z] 的搜尋! |
基本上解釋就是萬用字元是系統命令使用,一般用來匹配檔名或者什麼的用在系統命令中。而正則表達式是操作字串,以行尾單位來匹配字串使用的。
還有一點需要注意的是:*在萬用字元和正則表達式中有其不一樣的地方,在萬用字元中*可以匹配任意的0個或多個字元,而在正則表達式中他是重複之前的一個或者多個字元,不能獨立使用的。比如萬用字元可以用*來匹配任意字元,而正則表達式不行,他只匹配任意長度的前面的字元。
萬用字元是由shell處理的, 它只會出現在 命令的「參數」裡。當shell在「參數」中遇到了萬用字元時,shell會將其當作路徑或檔名去在磁碟上搜尋可能的匹配:若符合要求的匹配存在,則進行代換(路徑擴充套件);否則就將該萬用字元作爲一個普通字元傳遞給「命令」,然後再由命令進行處理。總之,萬用字元 實際上就是一種shell實現的路徑擴充套件功能。在 萬用字元被處理後, shell會先完成該命令的重組,然後再繼續處理重組後的命令,直至執行該命令。
SHELL中的萬用字元
幫助手冊:# man 7 glob
* |
匹配任意長度的任意字元,可以是0個 |
? |
匹配任意單個字元,必須是1個 |
[ ] |
匹配指定字元範圍內的任意單個字元 |
[a-z,A-Z,0-9] |
匹配所有數位字母,可以不加逗號 |
[a-z] |
表示a-z,A-Y,表示a,A,b,B.....a。不包含Z |
[A-Z] |
表示A,b,B.....z,Z。不包含a |
[a-Z] |
表示所有大小寫字母 |
[:upper:] |
所有大寫字母 |
[:lower:] |
所有小寫字母 |
[:alpha:] |
所有字母,大小寫 |
[:digit:] |
所有數位 |
[:alnum:] |
所有數位+字母 |
[:blank:] |
水平空白字元 |
[:space:] |
水平或垂直空白字元 |
[:punct:] |
標點符號 |
[:print:] |
可列印字元 |
[:cntrl:] |
控制(非列印)字元 |
[:graph:] |
圖形字元 |
[:xdigit:] |
十六進制字元 |
[^] |
匹配指定字元範圍外的任意單個字元 |
[^0-9] |
相當於[^[:digit:]] |
[^a-z] |
表示Z + 其他 |
[^A-Z] |
表示a + 其他 |
範例:
1、顯示/etc目錄下,所有以.d結尾的檔案或目錄
# ls -d /etc/*.d
/etc/bash_completion.d /etc/modprobe.d /etc/rc6.d
/etc/binfmt.d /etc/modules-load.d /etc/rc.d
/etc/chkconfig.d /etc/my.cnf.d /etc/request-key.d
/etc/cron.d /etc/pam.d /etc/rsyslog.d
/etc/depmod.d /etc/popt.d /etc/rwtab.d
/etc/dracut.conf.d /etc/prelink.conf.d /etc/setuptool.d
/etc/exports.d /etc/profile.d /etc/statetab.d
/etc/gdbinit.d /etc/rc0.d /etc/sudoers.d
/etc/grub.d /etc/rc1.d /etc/sysctl.d
/etc/init.d /etc/rc2.d /etc/tmpfiles.d
/etc/krb5.conf.d /etc/rc3.d /etc/xinetd.d
/etc/ld.so.conf.d /etc/rc4.d /etc/yum.repos.d
/etc/logrotate.d /etc/rc5.d
2、顯示/etc目錄下,所有.conf結尾,且以m,n,r,p開頭的檔案或目錄
#ls -d /etc/[mnrp]*.conf
/etc/man_db.conf /etc/nfsmount.conf /etc/resolv.conf
/etc/mke2fs.conf /etc/nsswitch.conf /etc/rsyncd.conf
/etc/nfs.conf /etc/request-key.conf /etc/rsyslog.conf
參考文章:
https://blog.csdn.net/huiguixian/article/details/6284834
https://www.cnblogs.com/ysuwangqiang/p/11364173.html