介紹如何在 Bash 指令稿中以變數的取代功能,將字串的特定部分替換為其他內容。
在 Bash 指令稿中若要對變數的內容進行文字的替換,可以使用以下變數取代的語法:
${parameter/pattern/string}
其中三個參數意義如下:
parameter
:變數名稱。pattern
:要進行替換的舊文字。string
:替換後的新文字。以下是一些常見的範例。
假設我們有一個變數 str
,其內容包含一些文字:
# 含有字串的變數 str="I believe I can fly. I believe I can touch the sky."
如果要把 str
內容中小寫的 e
替換為大寫的 E
,則可以這樣寫:
# 將第一個 e 替換為 E echo ${str/e/E}
I bElieve I can fly. I believe I can touch the sky.
在上面的文字替換方法中,只會對第一個發現的符合文字進行取代,若要替換所有符合的地方,可以使用兩條斜線來指定替換文字:
# 將所有 e 替換為 E echo ${str//e/E}
I bEliEvE I can fly. I bEliEvE I can touch thE sky.
在匹配文字的時候,可以運用萬用字元(*
)來比對文字:
# 使用萬用字元匹配文字 echo ${str/I can*/you can fly.}
I believe you can fly.
在匹配文字亦可使用 POSIX 字元類別:
# 將所有空白類字元取代為下底線 echo ${str//[[:space:]]/_}
I_believe_I_can_fly._I_believe_I_can_touch_the_sky.
我們也可以使用中括號的方式,自訂匹配的字元集合:
# 將 a,b,c,d 取代為 * echo ${str//[abcd]/*}
I *elieve I **n fly. I *elieve I **n tou*h the sky.
對於連續的字元,可以用起始與結束的字元指定範圍,上面的指令也可以寫成這樣:
# 將 a,b,c,d 取代為 * echo ${str//[a-d]/*}
I *elieve I **n fly. I *elieve I **n tou*h the sky.
如果在指定 pattern
的時候以 #
開頭,則代表比對字串的開頭。
例如若要將字串開頭的 I
替換為 You
,可以這樣寫:
# 將字串開頭的 I 替換為 You echo ${str/#I/You}
You believe I can fly. I believe I can touch the sky.
如果在指定 pattern
的時候以 %
開頭,則代表比對字串的結尾。
例如若要將字串結尾的 .
替換為 !!!
,可以這樣寫:
# 將字串結尾的 . 替換為 !!! echo ${str/%./\!\!\!}
I believe I can fly. I believe I can touch the sky!!!
若不指定替換後的文字,效果就等於將匹配的文字刪除:
# 將所有 e 刪除 echo ${str//e/}
I bliv I can fly. I bliv I can touch th sky.
如果要對 Bash 陣列中的每一個元素進行文字取代,可以用 @
或 *
作為陣列索引進行字串取代:
# 含有多個字串的陣列 arr=("I" "believe" "I" "can" "touch" "the" "sky") # 將所有元素結尾加上 ! echo ${arr[@]/%/\!}
I! believe! I! can! touch! the! sky!