Shell字符串截取的實(shí)現(xiàn)方法(非常詳細(xì))
Shell 截取字符串通常有兩種方式:從指定位置開(kāi)始截取和從指定字符(子字符串)開(kāi)始截取。
從指定位置開(kāi)始截取
這種方式需要兩個(gè)參數(shù):除了指定起始位置,還需要截取長(zhǎng)度,才能最終確定要截取的字符串。
既然需要指定起始位置,那么就涉及到計(jì)數(shù)方向的問(wèn)題,到底是從字符串左邊開(kāi)始計(jì)數(shù),還是從字符串右邊開(kāi)始計(jì)數(shù)。答案是 Shell 同時(shí)支持兩種計(jì)數(shù)方式。
1) 從字符串左邊開(kāi)始計(jì)數(shù)
如果想從字符串的左邊開(kāi)始計(jì)數(shù),那么截取字符串的具體格式如下:
${string: start :length}
其中,string 是要截取的字符串,start 是起始位置(從左邊開(kāi)始,從 0 開(kāi)始計(jì)數(shù)),length 是要截取的長(zhǎng)度(省略的話表示直到字符串的末尾)。
例如:
url="jb51.net"
echo ${url: 2: 9}
結(jié)果為biancheng。
再如:
url="jb51.net"
echo ${url: 2} #省略 length,截取到字符串末尾
結(jié)果為biancheng.net。
2) 從右邊開(kāi)始計(jì)數(shù)
如果想從字符串的右邊開(kāi)始計(jì)數(shù),那么截取字符串的具體格式如下:
${string: 0-start :length}
同第 1) 種格式相比,第 2) 種格式僅僅多了0-,這是固定的寫(xiě)法,專門(mén)用來(lái)表示從字符串右邊開(kāi)始計(jì)數(shù)。
這里需要強(qiáng)調(diào)兩點(diǎn):
- 從左邊開(kāi)始計(jì)數(shù)時(shí),起始數(shù)字是 0(這符合程序員思維);從右邊開(kāi)始計(jì)數(shù)時(shí),起始數(shù)字是 1(這符合常人思維)。計(jì)數(shù)方向不同,起始數(shù)字也不同。
- 不管從哪邊開(kāi)始計(jì)數(shù),截取方向都是從左到右。
例如:
url="jb51.net"
echo ${url: 0-13: 9}
結(jié)果為biancheng。從右邊數(shù),b是第 13 個(gè)字符。
再如:
url="jb51.net"
echo ${url: 0-13} #省略 length,直接截取到字符串末尾
結(jié)果為biancheng.net。
從指定字符(子字符串)開(kāi)始截取
這種截取方式無(wú)法指定字符串長(zhǎng)度,只能從指定字符(子字符串)截取到字符串末尾。Shell 可以截取指定字符(子字符串)右邊的所有字符,也可以截取左邊的所有字符。
1) 使用 # 號(hào)截取右邊字符
使用#號(hào)可以截取指定字符(或者子字符串)右邊的所有字符,具體格式如下:
${string#*chars}
其中,string 表示要截取的字符,chars 是指定的字符(或者子字符串),*是通配符的一種,表示任意長(zhǎng)度的字符串。*chars連起來(lái)使用的意思是:忽略左邊的所有字符,直到遇見(jiàn) chars(chars 不會(huì)被截?。?。
請(qǐng)看下面的例子:
url="http://jb51.net/index.html"
echo ${url#*:}
結(jié)果為//jb51.net/index.html。
以下寫(xiě)法也可以得到同樣的結(jié)果:
echo ${url#*p:}
echo ${url#*ttp:}
如果不需要忽略 chars 左邊的字符,那么也可以不寫(xiě)*,例如:
url="http://jb51.net/index.html"
echo ${url#http://}
結(jié)果為jb51.net/index.html。
注意,以上寫(xiě)法遇到第一個(gè)匹配的字符(子字符串)就結(jié)束了。例如:
url="http://jb51.net/index.html"
echo ${url#*/}
結(jié)果為/jb51.net/index.html。url 字符串中有三個(gè)/,輸出結(jié)果表明,Shell 遇到第一個(gè)/就匹配結(jié)束了。
如果希望直到最后一個(gè)指定字符(子字符串)再匹配結(jié)束,那么可以使用##,具體格式為:
${string##*chars}
請(qǐng)看下面的例子:
#!/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) 使用 % 截取左邊字符
使用%號(hào)可以截取指定字符(或者子字符串)左邊的所有字符,具體格式如下:
${string%chars*}
請(qǐng)注意*的位置,因?yàn)橐厝?chars 左邊的字符,而忽略 chars 右邊的字符,所以*應(yīng)該位于 chars 的右側(cè)。其他方面%和#的用法相同,這里不再贅述,僅舉例說(shuō)明:
#!/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é)果為 ---
匯總
最后,我們對(duì)以上 8 種格式做一個(gè)匯總,請(qǐng)看下表:
| 格式 | 說(shuō)明 |
|---|---|
| ${string: start :length} | 從 string 字符串的左邊第 start 個(gè)字符開(kāi)始,向右截取 length 個(gè)字符。 |
| ${string: start} | 從 string 字符串的左邊第 start 個(gè)字符開(kāi)始截取,直到最后。 |
| ${string: 0-start :length} | 從 string 字符串的右邊第 start 個(gè)字符開(kāi)始,向右截取 length 個(gè)字符。 |
| ${string: 0-start} | 從 string 字符串的右邊第 start 個(gè)字符開(kāi)始截取,直到最后。 |
| ${string#*chars} | 從 string 字符串第一次出現(xiàn) *chars 的位置開(kāi)始,截取 *chars 右邊的所有字符。 |
| ${string##*chars} | 從 string 字符串最后一次出現(xiàn) *chars 的位置開(kāi)始,截取 *chars 右邊的所有字符。 |
| ${string%*chars} | 從 string 字符串第一次出現(xiàn) *chars 的位置開(kāi)始,截取 *chars 左邊的所有字符。 |
| ${string%%*chars} | 從 string 字符串最后一次出現(xiàn) *chars 的位置開(kāi)始,截取 *chars 左邊的所有字符。 |
到此這篇關(guān)于Shell字符串截取的實(shí)現(xiàn)方法(非常詳細(xì))的文章就介紹到這了,更多相關(guān)Shell字符串截取內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
shell腳本echo輸出不換行功能增強(qiáng)實(shí)例
這個(gè)腳本很簡(jiǎn)單,就是可以用3種不同的函數(shù)(方法)來(lái)實(shí)現(xiàn),輸出后不換行2016-08-08
檢查L(zhǎng)inux系統(tǒng)中文件大小的方法總結(jié)
在Linux操作系統(tǒng)中,掌握如何高效檢查文件大小是每位開(kāi)發(fā)者和系統(tǒng)管理員的必備技能,本文詳細(xì)介紹了四種檢查L(zhǎng)inux文件大小的方法,感興趣的朋友可以參考下2024-03-03
一個(gè)Shell小腳本精準(zhǔn)統(tǒng)計(jì)Mysql每張表的行數(shù)實(shí)現(xiàn)
這篇文章主要介紹了一個(gè)Shell小腳本精準(zhǔn)統(tǒng)計(jì)Mysql每張表的行數(shù)實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
Linux下如何安裝Run文件格式NVIDIA顯卡驅(qū)動(dòng)
本篇文章給大家介紹Linux下如何安裝Run文件格式NVIDIA顯卡驅(qū)動(dòng),主要設(shè)計(jì)到linux下安裝run文件格式nvidia顯卡驅(qū)動(dòng)方面的知識(shí)點(diǎn),對(duì)linux下安裝run文件格式nvidia顯卡驅(qū)動(dòng)感興趣的朋友可以參考下本文2015-10-10
shell腳本分析 nginx日志訪問(wèn)次數(shù)最多及最耗時(shí)的頁(yè)面(慢查詢)
下面是我在做優(yōu)化時(shí)候,經(jīng)常用到的一段shell 腳本。 這個(gè)也可以算是,統(tǒng)計(jì)web頁(yè)面的slowpage 慢訪問(wèn)頁(yè)面,象mysql slowquery2013-11-11
linux crontab 實(shí)現(xiàn)每秒執(zhí)行的實(shí)例
下面小編就為大家?guī)?lái)一篇linux crontab 實(shí)現(xiàn)每秒執(zhí)行的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04
Shell腳本函數(shù)定義和函數(shù)參數(shù)
這篇文章主要介紹了Shell腳本函數(shù)定義和函數(shù)參數(shù),分別介紹了2種自定義函數(shù)的方法,以及定義帶返回值函數(shù)的方法,需要的朋友可以參考下2014-07-07

