天天看點

在linux中查找字元串長度,linux shell 字元串操作(長度,查找,替換)詳解

在做shell批處理程式時候,經常會涉及到字元串相關操作。有很多指令語句,如:awk,sed都可以做字元串各種操作。 其實shell内置一系列操作符号,可以達到類似效果,大家知道,使用内部操作符會省略啟動外部程式等時間,是以速度會非常的快。

一、判斷讀取字元串值

表達式

含義

${var}

變量var的值, 與$var相同

${var-DEFAULT}

如果var沒有被聲明, 那麼就以$DEFAULT作為其值 *

${var:-DEFAULT}

如果var沒有被聲明, 或者其值為空, 那麼就以$DEFAULT作為其值 *

${var=DEFAULT}

如果var沒有被聲明, 那麼就以$DEFAULT作為其值 *

${var:=DEFAULT}

如果var沒有被聲明, 或者其值為空, 那麼就以$DEFAULT作為其值 *

${var+OTHER}

如果var聲明了, 那麼其值就是$OTHER, 否則就為null字元串

${var:+OTHER}

如果var被設定了, 那麼其值就是$OTHER, 否則就為null字元串

${var?ERR_MSG}

如果var沒被聲明, 那麼就列印$ERR_MSG *

${var:?ERR_MSG}

如果var沒被設定, 那麼就列印$ERR_MSG *

${!varprefix*}

比對之前所有以varprefix開頭進行聲明的變量

${!varprefix@}

比對之前所有以varprefix開頭進行聲明的變量

加入了“*”  不是意思是: 當然, 如果變量var已經被設定的話, 那麼其值就是$var.

[[email protected] ~]$ echo ${abc-'ok'}

ok

[[email protected] ~]$ echo $abc

[[email protected] ~]$ echo ${abc='ok'}

ok

[[email protected] ~]$ echo $abc

ok

如果abc 沒有聲明“=" 還會給abc指派。

[[email protected] ~]$ var1=11;var2=12;var3=

[[email protected] ~]$ echo ${!v@}

var1 var2 var3

[[email protected] ~]$ echo ${!v*}

var1 var2 var3

${!varprefix*}與${!varprefix@}相似,可以通過變量名字首字元,搜尋已經定義的變量,無論是否為空值。

二、字元串操作(長度,讀取,替換)

表達式

含義

${#string}

$string的長度

${string:position}

在$string中, 從位置$position開始提取子串

${string:position:length}

在$string中, 從位置$position開始提取長度為$length的子串

${string#substring}

從變量$string的開頭, 删除最短比對$substring的子串

${string##substring}

從變量$string的開頭, 删除最長比對$substring的子串

${string%substring}

從變量$string的結尾, 删除最短比對$substring的子串

${string%%substring}

從變量$string的結尾, 删除最長比對$substring的子串

${string/substring/replacement}

使用$replacement, 來代替第一個比對的$substring

${string//substring/replacement}

使用$replacement, 代替所有比對的$substring

${string/#substring/replacement}

如果$string的字首比對$substring, 那麼就用$replacement來代替比對到的$substring

${string/%substring/replacement}

如果$string的字尾比對$substring, 那麼就用$replacement來代替比對到的$substring

說明:"* $substring”可以是一個正規表達式.

1.長度

[[email protected] ~]$ test='I love china'

[[email protected] ~]$ echo ${#test}

12

${#變量名}得到字元串長度

2.截取字串

[[email protected] ~]$ test='I love china'

[[email protected] ~]$ echo ${test:5}

e china

[[email protected] ~]$ echo ${test:5:10}

e china

${變量名:起始:長度}得到子字元串

3.字元串删除

[[email protected] ~]$ test='c:/windows/boot.ini'

[[email protected] ~]$ echo ${test#/}

c:/windows/boot.ini

[[email protected] ~]$ echo ${test#*/}

windows/boot.ini

[[email protected] ~]$ echo ${test##*/}

boot.ini

[[email protected] ~]$ echo ${test%},${test%/}

得到的結果為www.你的域名.com/cut-string.html,即删除從左邊開始到第一個"//"及其左邊所有字元

2、使用 ## 号操作符。用途是從左邊開始删除最後一次出現子字元串即其左邊字元,保留右邊字元。用法為##*substr,例如:

str='http://www.你的域名.com/cut-string.html'

echo ${str##*/}

得到的結果為cut-string.html,即删除最後出現的"/"及其左邊所有字元

3、使用 % 号操作符。用途是從右邊開始删除第一次出現子字元串即其右邊字元,保留左邊字元。用法為%substr*,例如:

str='http://www.你的域名.com/cut-string.html'

echo ${str%/*}

得到的結果為http://www.你的域名.com,即删除從右邊開始到第一個"/"及其右邊所有字元

4、使用 %% 号操作符。用途是從右邊開始删除最後一次出現子字元串即其右邊字元,保留左邊字元。用法為%%substr*,例如:

str='http://www.你的域名.com/cut-string.html'

echo ${str%%/*}

得到的結果為http://www.你的域名.com,即删除從右邊開始到最後一個"/"及其右邊所有字元第二種也分為四種,分别介紹如下:

1、從左邊第幾個字元開始以及字元的個數,用法為:start:len,例如:

str='http://www.你的域名.com/cut-string.html'

echo ${var:0:5}

其中的 0 表示左邊第一個字元開始,

5 表示字元的總個數。

結果是:http:

2、從左邊第幾個字元開始一直到結束,用法為:start,例如:

str='http://www.你的域名.com/cut-string.html'

echo ${var:7}

其中的 7 表示左邊第8個字元開始

結果是:www.你的域名.com/cut-string.html

3、從右邊第幾個字元開始以及字元的個數,用法:0-start:len,例如:

str='http://www.你的域名.com/cut-string.html'

echo ${str:0-15:10}

其中的 0-6 表示右邊算起第6個字元開始,10 表示字元的個數。

結果是:cut-string3、從右邊第幾個字元開始一直到結束,用法:0-start,例如:

str='http://www.你的域名.com/cut-string.html'

echo ${str:0-4}

其中的 0-6 表示右邊算起第6個字元開始,10 表示字元的個數。

結果是:html注:(左邊的第一個字元是用 0 表示,右邊的第一個字元用 0-1 表示)

網上其它參考内容

一、Linux shell 截取字元變量的前8位,有方法如下:

1.expr substr “$a” 1 8

2.echo $a|awk ‘{print substr(,1,8)}’

3.echo $a|cut -c1-8

4.echo $

5.expr $a : ‘(.\).*’

6.echo $a|dd bs=1 count=8 2>/dev/null

二、按指定的字元串截取

1、第一種方法:

${varible##*string} 從左向右截取最後一個string後的字元串

${varible#*string}從左向右截取第一個string後的字元串

${varible%%string*}從右向左截取最後一個string後的字元串

${varible%string*}從右向左截取第一個string後的字元串

“*”隻是一個通配符可以不要

例子:

$ MYVAR=foodforthought.jpg

$ echo ${MYVAR##*fo}

rthought.jpg

$ echo ${MYVAR#*fo}

odforthought.jpg

2、第二種方法:${varible:n1:n2}:截取變量varible從n1到n2之間的字元串。

可以根據特定字元偏移和長度,使用另一種形式的變量擴充,來選擇特定子字元串。試着在 bash 中輸入以下行:

$ EXCLAIM=cowabunga

$ echo ${EXCLAIM:0:3}

cow

$ echo ${EXCLAIM:3:7}

abunga

這種形式的字元串截斷非常簡便,隻需用冒号分開來指定起始字元和子字元串長度。

三、按照指定要求分割: 比如擷取字尾名 ls -al | cut -d “.” -f2