導讀
這是字串處理系列的第三篇文章。前兩篇基本覆蓋了字串處理中的常用操作,但在字串匹配方面,沒有詳細展開。
萬用字元(glob)是 shell 中的一個比較重要的概念,可以認為是正規表示式的簡化版本。萬用字元在字串匹配和檔名搜尋等方面非常有用。本篇只講它在字串匹配上的用法。
萬用字元的基本用法
之前在講字串匹配判斷時,萬用字元出現過,就是 *"$str"*
兩邊的星號。
% str1=abcd
% str2=bc
# 星號要在引號外邊
% [[ "$str1" == *"$str2"* ]] && echo good
good
# 注意帶萬用字元的字串必須放在右邊
% [[ *"$str2"* == "$str1" ]] && echo good
星號是最常用的萬用字元,用於匹配任意數量(包括 0 個)的任意字元。
# 問號用於匹配一個任意字元
% [[ abcd == ab?? ]] && echo good
good
# 中括號用於匹配出現在其中的單個字元
% [[ abcd == abc[bcd] ]] && echo good
good
# 如果中括號裡第一個字元是 ^,則匹配除了除了中括號裡的單個字元
% [[ abcd == abc[^de] ]] && echo good
% [[ abcd == abc[^ce] ]] && echo good
good
# 中括號裡可以指定字元的範圍
% [[ a4 == [a-b][2-5] ]] && echo good
good
# 可以指定多個字元範圍,並且可以摻雜其他字元
% [[ B4 == [a-cdddA-B][2-5] ]] && echo good
good
# 尖括號用於匹配一定範圍的單個整數
% [[ 123 == 12<3-4> ]] && echo good
good
# 可以匹配整個整數
% [[ 123 == <100-200> ]] && echo good
good
# 可以沒有上下界,預設的下界是 0,上界是正無窮
% [[ 123 == <100-> && 123 == <-200> ]] && echo good
good
# 可以上下界都沒有,那麼會匹配任意正整數和 0
# 這個可以用來判斷字串是否構成整數
# [[ 123 == <-> ]] && echo good
good
# ( 1 | 2 | ... ) 用於同時判斷多個條件,滿足一個即可
% [[ ab == (aa|ab) ]] && echo good
good
# 如果中括號裡要用 - 或者 ^,放在最後即可,不需要轉義
% [[ -^3 == [a-c-][3^-][3^-] ]] && echo good
good
以上是萬用字元的基本用法,總結一下。
萬用字元 | 含義 |
---|---|
* | 任意數量的任意字元 |
? | 任意一個字元 |
[abcd] | abcd 中的任意一個字元 |
[abcd] | 除 abcd 外的任意一個字元 |
[a-c] | a 和 c 之間的一個字元 |
[a-cB-Dxyz] | a 和 c 之間、B 和 D 之間以及 xyz 中的一個字元 |
<1-100> | 1 和 100 之間的整數 |
<-50> | 0 和 50 之間的整數 |
<100-> | 大於 100 的整數 |
<-> | 任意正整數和 0 |
([a-c]\ | <1-100>) |
加強版萬用字元
Zsh 還支援加強版萬用字元,功能更多一些。如果使用加強版的萬用字元,需要先在程式碼里加上 setopt EXTENDED_GLOB
。
萬用字元 | 含義 | 匹配的樣例 |
---|---|---|
abc | 除了 abc 外的任意字串 | aaa |
abcabc | 以 abc 開頭,但後邊不是 abc 的字串 | abcabd |
a*c~abc | 符合 a*c 但不是 abc 的字串 | adc |
a# | 任意數量(包括 0)個 a | aaa |
b## | 一個或者多個 b | b |
(ab)## | 一個或者多個 ab | abab |
(#i)abc | 忽略大小寫的 abc | AbC |
(#i)ab(#I)c | 忽略大小寫的 ab 接著 c | ABc |
(#l)aBc | a 和 c 忽略大小寫,但 B 必須大寫 的 aBc | aBC |
(#a1)abc | 最多錯(多或缺也算)一個字元的 abc | a2c 或 ab 或 abcd |
此外還有一些更高階的用法,暫時先略過。
總結
字串的內容先告一段落,但之後的文章依然會不斷地涉及字串,因為陣列和雜湊表裡的內容通常是字串,處理目錄檔案時也涉及大量的字串操作等等,屆時會有新的字串處理方法。此外,如果我發現新的處理字串的方法或者技巧,也會更新這幾篇文章。
參考
http://www.bash2zsh.com/zsh_refcard/refcard.pdf