Zsh 開發指南(四): 字串處理之萬用字元

陌辭寒發表於2022-11-27

Zsh 開發指南(四): 字串處理之萬用字元

導讀

這是字串處理系列的第三篇文章。前兩篇基本覆蓋了字串處理中的常用操作,但在字串匹配方面,沒有詳細展開。

萬用字元(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

相關文章