溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Shell字符串截取如何實現(xiàn)

發(fā)布時間:2021-03-15 11:02:58 來源:億速云 閱讀:178 作者:TREX 欄目:開發(fā)技術(shù)

這篇文章主要講解了“Shell字符串截取如何實現(xiàn)”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Shell字符串截取如何實現(xiàn)”吧!

Shell 截取字符串通常有兩種方式:從指定位置開始截取和從指定字符(子字符串)開始截取。

從指定位置開始截取

這種方式需要兩個參數(shù):除了指定起始位置,還需要截取長度,才能最終確定要截取的字符串。

既然需要指定起始位置,那么就涉及到計數(shù)方向的問題,到底是從字符串左邊開始計數(shù),還是從字符串右邊開始計數(shù)。答案是 Shell 同時支持兩種計數(shù)方式。

1) 從字符串左邊開始計數(shù)

如果想從字符串的左邊開始計數(shù),那么截取字符串的具體格式如下:

${string: start :length}

其中,string 是要截取的字符串,start 是起始位置(從左邊開始,從 0 開始計數(shù)),length 是要截取的長度(省略的話表示直到字符串的末尾)。

例如:

url="jb51.net"
echo ${url: 2: 9}

結(jié)果為biancheng。

再如:

url="jb51.net"
echo ${url: 2} #省略 length,截取到字符串末尾

結(jié)果為biancheng.net。

2) 從右邊開始計數(shù)

如果想從字符串的右邊開始計數(shù),那么截取字符串的具體格式如下:

${string: 0-start :length}

同第 1) 種格式相比,第 2) 種格式僅僅多了0-,這是固定的寫法,專門用來表示從字符串右邊開始計數(shù)。

這里需要強(qiáng)調(diào)兩點:

  • 從左邊開始計數(shù)時,起始數(shù)字是 0(這符合程序員思維);從右邊開始計數(shù)時,起始數(shù)字是 1(這符合常人思維)。計數(shù)方向不同,起始數(shù)字也不同。

  • 不管從哪邊開始計數(shù),截取方向都是從左到右。

例如:

url="jb51.net"
echo ${url: 0-13: 9}

結(jié)果為biancheng。從右邊數(shù),b是第 13 個字符。

再如:

url="jb51.net"
echo ${url: 0-13} #省略 length,直接截取到字符串末尾

結(jié)果為biancheng.net。

從指定字符(子字符串)開始截取

這種截取方式無法指定字符串長度,只能從指定字符(子字符串)截取到字符串末尾。Shell 可以截取指定字符(子字符串)右邊的所有字符,也可以截取左邊的所有字符。

1) 使用 # 號截取右邊字符

使用#號可以截取指定字符(或者子字符串)右邊的所有字符,具體格式如下:

${string#*chars}

其中,string 表示要截取的字符,chars 是指定的字符(或者子字符串),*是通配符的一種,表示任意長度的字符串。*chars連起來使用的意思是:忽略左邊的所有字符,直到遇見 chars(chars 不會被截?。?。

請看下面的例子:

url="http://jb51.net/index.html"
echo ${url#*:}

結(jié)果為//jb51.net/index.html。

以下寫法也可以得到同樣的結(jié)果:

echo ${url#*p:}
echo ${url#*ttp:}

如果不需要忽略 chars 左邊的字符,那么也可以不寫*,例如:

url="http://jb51.net/index.html"
echo ${url#http://}

結(jié)果為jb51.net/index.html。

注意,以上寫法遇到第一個匹配的字符(子字符串)就結(jié)束了。例如:

url="http://jb51.net/index.html"
echo ${url#*/}

結(jié)果為/jb51.net/index.html。url 字符串中有三個/,輸出結(jié)果表明,Shell 遇到第一個/就匹配結(jié)束了。

如果希望直到最后一個指定字符(子字符串)再匹配結(jié)束,那么可以使用##,具體格式為:

${string##*chars}

請看下面的例子:

#!/bin/bash
url="http://jb51.net/index.html"
echo ${url#*/}  #結(jié)果為 /jb51.net/index.html
echo ${url##*/}  #結(jié)果為 index.html
str="---aa+++aa@@@"
echo ${str#*aa}  #結(jié)果為 +++aa@@@
echo ${str##*aa} #結(jié)果為 @@@

2) 使用 % 截取左邊字符

使用%號可以截取指定字符(或者子字符串)左邊的所有字符,具體格式如下:

${string%chars*}

請注意*的位置,因為要截取 chars 左邊的字符,而忽略 chars 右邊的字符,所以*應(yīng)該位于 chars 的右側(cè)。其他方面%和#的用法相同,這里不再贅述,僅舉例說明:

#!/bin/bash
url="http://jb51.net/index.html"
echo ${url%/*} #結(jié)果為 http://jb51.net
echo ${url%%/*} #結(jié)果為 http:
str="---aa+++aa@@@"
echo ${str%aa*} #結(jié)果為 ---aa+++
echo ${str%%aa*} #結(jié)果為 ---

匯總

最后,我們對以上 8 種格式做一個匯總,請看下表:

格式說明
${string: start :length}從 string 字符串的左邊第 start 個字符開始,向右截取 length 個字符。
${string: start}從 string 字符串的左邊第 start 個字符開始截取,直到最后。
${string: 0-start :length}從 string 字符串的右邊第 start 個字符開始,向右截取 length 個字符。
${string: 0-start}從 string 字符串的右邊第 start 個字符開始截取,直到最后。
${string#*chars}從 string 字符串第一次出現(xiàn) *chars 的位置開始,截取 *chars 右邊的所有字符。
${string##*chars}從 string 字符串最后一次出現(xiàn) *chars 的位置開始,截取 *chars 右邊的所有字符。
${string%*chars}從 string 字符串第一次出現(xiàn) *chars 的位置開始,截取 *chars 左邊的所有字符。
${string%%*chars}從 string 字符串最后一次出現(xiàn) *chars 的位置開始,截取 *chars 左邊的所有字符。

感謝各位的閱讀,以上就是“Shell字符串截取如何實現(xiàn)”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Shell字符串截取如何實現(xiàn)這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI