1. 程式人生 > >shell字符串處理

shell字符串處理

字符處理 spa bstr div 倒數 tom echo 並不會 不同的

一、字符串切片:

${#var}:返回字符串變量var的長度
${var:offset}:返回字符串變量var中從第offset個字符後(不包括第offset個字符)的字符開始,到最後的部分,offset的取值在0到 ${#var}-1 之間(bash4.2後,允許為負值)
${var:offset:number}:返回字符串變量var中從第offset個字符後(不包括第offset個字符)的字符開始,長度為number的部分
${var: -length}:取字符串的最右側幾個字符,註意:冒號後必須有一空白字符
${var:offset:-length}:從最左側跳過offset字符,一直向右取到距離最右側lengh個字符之前的內容
${var: -length:-offset}:先從最右側向左取到length個字符開始,再向右取到距離最右側offset個字符之間的內容,註意:-length前空格,同樣的表達形式,offset的表現行為和數組的是反著的。

字符串切片實例:

  1. a=‘abcdefghijklmn‘
  2. echo ${#a} #輸出字符串a的總長度
  3. 14
  4. echo ${a:4} #輸出字符串a從0開始數,包含第4個元素之後的所有元素
  5. efghijklmn
  6. echo ${a:4:3} #輸出字符串a從0開始數,包含第4個元素之後的3個元素
  7. efg
  8. echo ${a: -4} #從字符串a的右側向左取4個元素,冒號後必須有一個空字符
  9. klmn
  10. echo ${a:5:-2} #輸出字符串a從0開始數,包含第5個元素的向右數的i倒數3個元素,註意這種用法依賴bash版本,盡量別用。
  11. fghijkl
  12. echo ${a: -5:-2} #從字符串a的右側向左數5個,再向右取到倒數3個字符,註意這種用法依賴bash版本,盡量別用。
  13. jkl
  14. echo ${a: -5:2} #從字符串a的右側向左數5個,再向右取2個字符
  15. jk

二、基於模式取子串

${var#*word}:其中word可以是指定的任意字符功能:自左而右,查找var變量所存儲的字符串中,第一次出現的word, 刪除字符串開頭至第一次出現word字符之間的所有字符
${var##*word}:同上,貪婪模式,不同的是,刪除的是字符串開頭至最後一次由word指定的字符之間的所有內容
${var%word*}:其中word可以是指定的任意字符;功能:自右而左,查找var變量所存儲的字符串中,第一次出現的word, 刪除字符串最後一個字符向左至第一次出現word字符之間的所有字符;
${var%%word*}:同上,只不過刪除字符串最右側的字符向左至最後一次出現word字符之間的所有字符;

字符處理實例:

  1. a=‘abcdefg_a_fghijklmn‘
  2. echo ${a#*fg} #從左邊開始刪,刪除起始位置到第一個fg為止,包括fg
  3. _a_fghijklmn
  4. echo ${a##*fg} #貪婪模式,左邊開始刪,刪除起始位置到最後一個fg為止,包括fg
  5. hijklmn
  6. echo ${a%fg*} #從右邊開始刪,刪除終點位置到第一個fg為止,包括fg
  7. abcdefg_a_
  8. echo ${a%%fg*} #貪婪模式,從右邊開始刪,刪除重點位置到最後一個fg為止,包括fg
  9. abcde

三、字符串的查找替換

${var/pattern/substr}:查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substr替換之
${var//pattern/substr}: 查找var所表示的字符串中,所有能被pattern所匹配到的字符串,以substr替換之
${var/#pattern/substr}:查找var所表示的字符串中,行首被pattern所匹配到的字符串,以substr替換之
${var/%pattern/substr}:查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substr替換之

查找替換實例:

  1. a=‘abcdefg_a_fghijklmn‘
  2. echo ${a/fg/dd} #替換從左邊數第一個fg為dd
  3. abcdedd_a_fghijklmn
  4. echo ${a//fg/dd} #替換字符串中所有的fg為dd
  5. abcdedd_a_ddhijklmn
  6. echo ${a/#ab/dd} #如果開頭是ab則替換成dd
  7. ddcdefg_a_fghijklmn
  8. echo ${a/#fd/dd} #如果開頭是fd則替換成dd
  9. abcdefg_a_fghijklmn #開頭不是fd不做替換
  10. echo ${a/%mn/dd} #結尾是mn則替換成dd
  11. abcdefg_a_fghijkldd
  12. echo ${a/%fd/dd} #如果結尾是fd則替換成dd
  13. abcdefg_a_fghijklmn #結尾並不是fd不做替換

四、查找並刪除字符串

和查找替換類似,只不過沒有替換值

${var/pattern}:刪除var所表示的字符串中第一次被pattern所匹配到的字符串
${var//pattern}:刪除var所表示的字符串中所有被pattern所匹配到的字符串
${var/#pattern}:刪除var所表示的字符串中所有以pattern為行首所匹配到的字符串
${var/%pattern}:刪除var所表示的字符串中所有以pattern為行尾所匹配到的字符串

和查找替換語法一樣,只不過沒有替換值和斜線,這裏就不做演示了。

五、符大小寫轉換

${var^^}:把var中的所有小寫字母轉換為大寫
${var,,}:把var中的所有大寫字母轉換為小寫

總結:使用shell內部的字符串處理功能能提高很多的工作效率,以及節省部分機器性能,但是需要註意的一點,字符串處理變量的值並不會改變變量的數據,只是輸出的時候進行了變更。

六、字符串變量賦值

技術分享圖片

使用字符串的變量賦值,可以代替部分的if else讓語法更簡潔。

shell字符串處理