背景:在linux使用過程中,經常需要查詢檔案,對命令中的萬用字元 pattern 和正規表示式的區分不是很清楚。有必要好好研究一下。
1 掃盲
1.1 萬用字元和正規表示式
當在使用命令行時,有很多時間都用來查詢你所需要的檔案,如ls find
等。 shell 提供了一套完整的字串模式匹配規則,或者稱之為元字元,當 shell 遇到上述字元時,就會把它們當作特殊字元,而不是檔名中的普通字元,這樣使用者就可以用它們來匹配相應的檔名,我理解這可以稱為萬用字元。
萬用字元與正規表示式是有區別的,簡單來說:萬用字元是用來通配的,正規表示式是用來匹配字串的;
萬用字元是shell自帶的用於匹配檔名的工具,多用在檔名上,比如查詢find
,ls
,cp
等等,而正規表示式則需要特定命令的支援才可以使用,如:grep
、sed
和awk
(號稱linux三劍客)、vi/vim
、perl
等,這些都是處理文字的工具。
其次,shell對萬用字元與正規表示式的處理也有不同,「 」
內一般為萬用字元(是shell本身提取處理),『 』
內一般為正規表示式(shell會將其中的資料傳遞給其它命令處理)。
2 萬用字元詳細介紹
測試資料
touch a a6.log abc.log ac.txt b c c5.txt x.log a
刪除操作
例如:刪除a、b、c
和以.txt
結尾的檔案
rm -f
當然既然可以查詢當然也可以使用萬用字元匹配的方式進行移動檔案,如果需要在存在很多檔案的資料夾中移動某些型別的檔案那麼使用萬用字元匹配的效率就顯而易見了;當時萬用字元的使用技巧不單單只有這些,有空的可以多去研究。
3 例項
*
匹配檔名中的任何字串,包括空字串。
?
匹配檔名中的任何單個字元。
[...]
匹配[ ]中所包含的任何字元。
[!...]
匹配[ ]中非感嘆號!之後的字元。和^的效果一樣
如:5*
5開頭的所有字串
*5
5結尾的所有字串
*5?
以5為倒數第二個字元的字串
[0-9]
所有以數字的字元
[1,2]
1或者2
[!0-9]
不是數字的字元
ls /etc/[!a-n]*.conf
列出/etc/目錄中不是以字母a到n開頭的,並且以.conf結尾的檔案
ls /etc/[a-n]*.conf
列出/etc/目錄中以字母a到n開頭的,並且以.conf結尾的檔案
ls /bin/[ck]*
列出以 c或k開頭的檔名
4 正規表示式詳細介紹
Linux正規表示式 萬用字元
萬用字元元字元或者句點 被認為是與變數等價的。變數表示算術表示式中的任意值。在正規表示式中,句點 是代表除換行符以外的任意字元的萬用字元 在awk中,句點甚至可以匹配嵌入式換行符 假定我們正在描述乙個字串行,使用萬用字元元字元可以指定任何字元都可以填充的乙個位置。例如,如果要索索包含intel系統微...
萬用字元與正規表示式
萬用字元與正規表示式很容易混淆,首先要明白二者是不同的,個人感覺萬用字元用於linux的shell命令 如檔名相關操作 中,而正規表示式用於文字內容中的字串搜尋和替換等。萬用字元是linux系統本身就支援的,而正規表示式用於vim編輯器或awk程式,這些文字處理工具正是由於支援正規表示式才變得強大。...
萬用字元與正規表示式
萬用字元與正規表示式很容易混淆,首先要明白二者是不同的,個人感覺萬用字元用於linux的shell命令 如檔名相關操作 中,而正規表示式用於文字內容中的字串搜尋和替換等。萬用字元是linux系統本身就支援的,而正規表示式用於vim編輯器或awk程式,這些文字處理工具正是由於支援正規表示式才變得強大。...