shell 中 貪婪匹配 和 非貪婪匹配

舉個栗子:

  

1
2
v=jfedu.shiyiwen.com
echo ${v%.*}

 一個%爲非貪婪匹配,即匹配最短結果。%從右到左進行非貪婪匹配,匹配什麼呢? 匹配已 .*的字符。 那麼當然是匹配到了.com 然後執行刪除匹配到的字符。結果就是(這裏的 "." 相當於定界符。而“*”是通配符)

jfedu.shiyiwen

1
echo ${v%%.*}

 而這裏執行貪婪匹配,即匹配最長結果就匹配到了 .shiyiwen.com 結果爲

jfedu

 

 

這裏在說一個 # 剛好和 %順序相反而已,#是從左到右來進行匹配的。 老規矩:舉個栗子

1
2
3
4
5
6
7
v=jfedu.shiyiwen.com
 
echo ${v#*.}
shiyiwen.com
 
echo ${v##*.}
com

 用處有很多,比較常見的就是很方便的獲取文件後綴名和文件名。舉個栗子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
01.#!/bin/bash 
02. 
03.num=1 
04.for in *.tar *.tar.gz 
05.do 
06.new=new_$num.${i#*.}     
07.mv $i $new 2>/dev/null 
08. 
09.if [ $? -eq 0 ];then 
10.    echo "remove $i to $new" 
11.    let num++ 
12.fi 
13.     
14.done

 

在補充一些:

${#VALUE}:計算VALUE字符串的字符數量。

  • ${VALUE%.*}${VALUE%%.*}:刪除VALUE字符串中以分隔符“.”匹配的右邊字符,保留左邊字符。
  • ${VALUE#*.}${VALUE##*.}:刪除VALUE字符串中以分隔符“.”匹配的左邊字符,保留右邊字符。
  • ${VALUE/OLD/NEW}${VALUE//OLD/NEW}:用NEW子串替換VALUE字符串中匹配的OLD子串。

    補充:“*”表示通配符,用於匹配字符串將被刪除的字串。“.”表示字符串中分隔符,可以爲任意一個或多個字符。“%”表示從右向左匹配,“#”表示從左向右匹配,“\”表示替換,都屬於非貪婪匹配,即匹配符合通配符的最短結果。與“%”、“#”和“/”類似的有“%%”、“##”和“//”,都屬於貪婪匹配,即匹配符合通配符的最長結果。

  1. ${VALUE:OFFSET}${VALUE:OFFSET:LENGTH}:從VALUE字符串的左邊開始中截取子串。
  2. ${VALUE:0-OFFSET}${VALUE:0-OFFSET:LENGTH}:從VALUE字符串的右邊開始中截取子串。

    補充:左邊第一個字符從“0”開始,右邊第一個字符從“0-1”開始。 表示偏移OFFSET個字符開始,LENGTH表示要截取字符的長度。如果沒有LENGTH變量,表示偏移OFFSET個字符開始到字符串結束。

  1. ${VALUE:-WORD}:當變量未定義或者值爲空時,返回值爲WORD的內容,否則返回變量的值。
  2. ${VALUE:=WORD}:當變量未定義或者值爲空時,返回WORD的值的同時並將WORD賦值給VALUE,否則返回變量的值。
  3. ${VALUE:+WORD}:當變量已賦值時,其值才用WORD替換,否則不進行任何替換。
  4. ${VALUE:?MESSAGE}:當變量已賦值時,正常替換。否則將消息MESSAGE送到標準錯誤輸出(若此替換出現在SHELL程序中,那麼該程序將終止運行)。

    補充:WORD可以爲一個字符串,也可以爲一個變量。當爲變量時,需要用“$”引用該變量。

另外 ${}的用途,請查看博客的另外一篇博文。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章