Linux

Bash 程式設計教學與範例:變數取代字串

介紹如何在 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 字元類別

在匹配文字亦可使用 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!

參考資料

Share
Published by
Office Guide
Tags: Bash

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

1 年 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

1 年 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

1 年 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

1 年 ago