如何在 Linux 上的 Bash 中操作字符串

已發表: 2022-07-28
筆記本電腦屏幕上的 Linux 命令行。
fatmawati achmad zaenuri/Shutterstock.com

如果說 Linux 具備一件事,那就是操作字符串的實用程序。 但是 Bash shell 中也內置了一整套功能。 這是它的使用方法。

字符串操作

Linux 生態系統包含用於處理文本和字符串的出色工具。 這些包括 awk、grep、sed 和 cut。 對於任何重量級的文本爭論,這些應該是您的首選。

但有時,使用 shell 的內置功能很方便,尤其是在您編寫簡短的腳本時。 如果您的腳本要與其他人共享,並且要在他們的計算機上運行,那麼使用標準 Bash 功能意味著您不必擔心任何其他實用程序的存在或版本。

如果您需要專用實用程序的強大功能,請務必使用它們。 這就是他們的目的。 但通常你的腳本和 Bash 可以自己完成工作。

因為它們是 Bash 內置程序,所以您可以在腳本或命令行中使用它們。 在終端窗口中使用它們是創建命令原型和完善語法的一種快速便捷的方法。 它避免了編輯、保存、運行和調試週期。

創建和使用字符串變量

我們需要聲明一個變量並為其分配一個字符串,只需為變量命名、使用等號=並提供字符串。 如果字符串中有空格,請將其用單引號或雙引號括起來。 確保等號兩邊沒有空格。

 my_string="你好,極客世界指南。"
 迴聲 $my_string 

創建和寫入字符串變量

創建變量後,該變量名將添加到 shell 的製表符完成詞列表中。 在此示例中,鍵入“my_”並按“Tab”鍵在命令行中輸入了全名。

只讀變量

有一個declare命令,我們可以使用它來聲明變量。 在簡單的情況下,您並不需要它,但使用它可以讓您使用一些命令的選項。 您最常使用的可能是-r (只讀)選項。 這會創建一個無法更改的只讀變量。

 declare -r read_only_var="這是一個不可變字符串!"

如果我們嘗試為它分配一個新值,它會失敗。

 read_only_var="一個新字符串..." 

無法更改只讀字符串變量

寫入終端窗口

我們可以使用 echo 或 printf 將多個字符串寫入終端窗口,使它們看起來好像是一個字符串。 而且我們不限於我們自己的字符串變量,我們可以將環境變量合併到我們的命令中。

 user_account="您的用戶帳號是:"
 回顯 $user_account $USER 

將兩個字符串寫入終端窗口,就好像它們是一個字符串一樣

連接字符串

加號運算符+=可讓您將兩個字符串“相加”。 這叫做串聯。

 user_account="您的用戶帳號是:"
 user_account+=$USER
 回顯 $user_account 

用 += 連接字符串

請注意,您不會在連接的字符串之間自動添加空格。 如果需要空格,則需要在第一個字符串的末尾或第二個字符串的開頭顯式放置一個。

 user_account="您的用戶帳號是:"
 user_account+=$USER
 回顯 $user_account 

在使用 += 連接兩個字符串之前添加一個額外的空格

相關:如何在 Linux 上的 Bash 中設置環境變量

讀取用戶輸入

除了創建將其內容定義為聲明的一部分的字符串變量外,我們還可以將用戶輸入讀入字符串變量。

read命令讀取用戶輸入。 -p (提示)選項將提示寫入終端窗口。 用戶的輸入存儲在字符串變量中。 在此示例中,該變量稱為user_file

 read -p "打開哪個文件?" user_file
 回顯 $user_file 

讀取用戶字符串輸入

如果您不提供字符串變量來捕獲輸入,它仍然可以工作。 用戶輸入將存儲在一個名為REPLY的變量中。

 read -p "打開哪個文件?"
 迴聲 $REPLY 

在不提供字符串變量的情況下讀取用戶輸入

提供您自己的變量並給它一個有意義的名稱通常更方便。

操作字符串

現在我們有了字符串,無論是在創建時定義的、從用戶輸入中讀取的還是通過連接字符串創建的,我們都可以開始使用它們了。

查找字符串長度

如果知道字符串的長度很重要或有用,我們可以通過在變量名前加上哈希“ # ”符號來獲得它。

 my_string="這個字符串有 39 個字符。"
 迴聲 ${#my_string} 

獲取字符串的長度

按字符偏移量提取子串

我們可以通過在字符串中提供起點和可選長度來從字符串變量中提取子字符串。 如果我們不提供長度,則子字符串將包含從起點到最後一個字符的所有內容。

起點和長度跟在變量名後面,中間有一個冒號“ : ”。 請注意,字符串變量中的字符從零開始編號。

 long_string="科學怪人或現代普羅米修斯"
 子串=${long_string:0:12}
 回顯 $substring
 迴聲 ${long_string:27} 

從字符串的開頭和結尾提取子字符串

另一種變體允許您從字符串的尾部丟棄一些字母。 實際上,它可以讓您設置起點,並使用負數作為長度。 子字符串將包含從起點到字符串結尾的字符,減去您在負數中指定的字符數。

 my_string="字母"
 迴聲 ${my_string:5:-4} 

從字符串中間提取子字符串

在所有情況下,原始字符串變量都不會受到影響。 “提取的”子字符串實際上並未從變量的內容中刪除。

按分隔符提取子字符串

使用字符偏移的缺點是您需要提前知道要提取的子字符串在字符串中的位置。

如果您的字符串由重複字符分隔,您可以提取子字符串而不知道它們在字符串中的位置,也不知道它們有多長。

要從字符串的前面進行搜索,請在變量名後面加上雙百分號%% 、分隔符和星號* 。 此字符串中的單詞由空格分隔。

 long_string="第一第二第三第四第五"
 迴聲 ${long_string%%' '*} 

通過分隔符從字符串的前面提取子字符串

這將返回不包含分隔符的字符串前面的第一個子字符串。 這稱為短子字符串選項。

long substring 選項返回字符串的前面部分,直到最後一個分隔子字符串。 換句話說,它省略了最後一個分隔的子字符串。 在語法上,唯一的區別是它在命令中使用了一個百分號“ % ”。

 long_string="第一第二第三第四第五"
 迴聲 ${long_string%' '*} 

通過分隔符從字符串的前面提取長子字符串

正如您所期望的,您可以從字符串末尾以相同的方式進行搜索。 使用井號“ # ”代替百分號,並將分隔符移動到命令中的星號“ *之後

 long_string="this.long.string.of.words.is.delimited.by.periods"
 迴聲 ${long_string##*.} 

通過分隔符從字符串末尾提取子字符串

這是短子字符串選項,它會修剪從字符串後面找到的第一個不包含分隔符的子字符串。

 long_string="this.long.string.of.words.is.delimited.by.periods"
 迴聲 ${long_string#*.} 

通過分隔符從字符串末尾提取長子字符串

long substring 選項返回字符串的後面部分,直到字符串前面的第一個分隔符。 換句話說,它省略了第一個分隔的子字符串。

子串替換

將子串換成其他子串很容易。 格式是字符串的名稱、要替換的子字符串、要插入的子字符串,用正斜杠“ / ”字符分隔。

 string="藍豬咯咯笑"
 迴聲 ${字符串/豬/山羊} 

替換字符串中的子字符串

要將搜索限制在字符串的末尾,請在搜索字符串前加上百分號“ % ”字符。

 string="藍豬咯咯笑"
 echo ${string/%giggles/chuckles} 

在字符串末尾替換子字符串

要將搜索限制在字符串的開頭,請在搜索字符串之前加上一個井號“ # ”字符。

 string="藍豬咯咯笑"
 迴聲 ${string/#blue/yellow} 

在字符串的開頭替換子字符串

字符串是一個靈活的東西

如果字符串不是您想要的或需要的,這些工具將幫助您重新格式化它,使其適合您的需要。 對於復雜的轉換,請使用專用實用程序,但對於較小的調整,請使用內置的 shell 並避免加載和運行外部工具的開銷。

相關:你想知道的關於 Linux 上的 inode 的一切