新聞中心

創(chuàng)新互聯(lián)建站專注于企業(yè)全網(wǎng)整合營銷推廣、網(wǎng)站重做改版、澠池網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、H5頁面制作、成都商城網(wǎng)站開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為澠池等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
從指定位置開始截取
這種方式需要兩個參數(shù):除了指定起始位置,還需要截取長度,才能最終確定要截取的字符串。
既然需要指定起始位置,那么就涉及到計數(shù)方向的問題,到底是從字符串左邊開始計數(shù),還是從字符串右邊開始計數(shù)。答案是 Shell 同時支持兩種計數(shù)方式。
1) 從字符串左邊開始計數(shù)
如果想從字符串的左邊開始計數(shù),那么截取字符串的具體格式如下:
${string: start :length}
其中,string 是要截取的字符串,start 是起始位置(從左邊開始,從 0 開始計數(shù)),length 是要截取的長度(省略的話表示直到字符串的末尾)。
例如:
url="c.biancheng.net"
echo ${url: 2: 9}
結(jié)果為
biancheng。
再如:
url="c.biancheng.net"
echo ${url: 2} #省略 length,截取到字符串末尾
結(jié)果為
biancheng.net。
2) 從右邊開始計數(shù)
如果想從字符串的右邊開始計數(shù),那么截取字符串的具體格式如下:
${string: 0-start :length}
同第 1) 種格式相比,第 2) 種格式僅僅多了
0-,這是固定的寫法,專門用來表示從字符串右邊開始計數(shù)。
這里需要強(qiáng)調(diào)兩點(diǎn):
- 從左邊開始計數(shù)時,起始數(shù)字是 0(這符合程序員思維);從右邊開始計數(shù)時,起始數(shù)字是 1(這符合常人思維)。計數(shù)方向不同,起始數(shù)字也不同。
- 不管從哪邊開始計數(shù),截取方向都是從左到右。
例如:
url="c.biancheng.net"
echo ${url: 0-13: 9}
結(jié)果為
biancheng。從右邊數(shù),
b是第 13 個字符。
再如:
url="c.biancheng.net"
echo ${url: 0-13} #省略 length,直接截取到字符串末尾
結(jié)果為
biancheng.net。
從指定字符(子字符串)開始截取
這種截取方式無法指定字符串長度,只能從指定字符(子字符串)截取到字符串末尾。Shell 可以截取指定字符(子字符串)右邊的所有字符,也可以截取左邊的所有字符。
1) 使用 # 號截取右邊字符
使用
#號可以截取指定字符(或者子字符串)右邊的所有字符,具體格式如下:
${string#*chars}
其中,string 表示要截取的字符,chars 是指定的字符(或者子字符串),
*是通配符的一種,表示任意長度的字符串。
*chars連起來使用的意思是:忽略左邊的所有字符,直到遇見 chars(chars 不會被截?。?。
請看下面的例子:
url="http://c.biancheng.net/index.html"
echo ${url#*:}
結(jié)果為
//c.biancheng.net/index.html。
以下寫法也可以得到同樣的結(jié)果:
echo ${url#*p:}
echo ${url#*ttp:}
如果不需要忽略 chars 左邊的字符,那么也可以不寫
*,例如:
url="http://c.biancheng.net/index.html"
echo ${url#http://}
結(jié)果為
c.biancheng.net/index.html。
注意,以上寫法遇到第一個匹配的字符(子字符串)就結(jié)束了。例如:
url="http://c.biancheng.net/index.html"
echo ${url#*/}
結(jié)果為
/c.biancheng.net/index.html。url 字符串中有三個
/,輸出結(jié)果表明,Shell 遇到第一個
/就匹配結(jié)束了。
如果希望直到最后一個指定字符(子字符串)再匹配結(jié)束,那么可以使用
##,具體格式為:
${string##*chars}
請看下面的例子:
#!/bin/bash
url="http://c.biancheng.net/index.html"
echo ${url#*/} #結(jié)果為 /c.biancheng.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://c.biancheng.net/index.html"
echo ${url%/*} #結(jié)果為 http://c.biancheng.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 左邊的所有字符。 |
網(wǎng)頁標(biāo)題:Shell字符串截取(非常詳細(xì))
瀏覽路徑:http://www.dlmjj.cn/article/cdpdcgj.html


咨詢
建站咨詢
