shell 中獲取子字符串的正確姿勢


前言

shell 取子串的方式有點特別,你寫的匹配字符串是需要從頭開始匹配的,第一個匹配到了才開始匹配下一個,這個類似於python中的match的工作方式。

1,獲取子串有兩種方式

  • 使用字符串匹配的方式去截取。其中匹配的方式和python中的match的工作方式很像,只是其截取的是那些 沒有匹配 到的字符串而已。
  • 使用下標的方式去截取

2,匹配的方式

2.1, 左邊開始匹配
  • #:最小限度開始匹配
  • ##:最大限度開始匹配

案例:

👉⚡️str="hello~world~~~Ha"
👉⚡️echo ${str#hello~}
world~~~Ha
👉⚡️echo ${str#*~}
world~~~Ha

# 沒有匹配到則顯示全部
👉⚡️echo ${str##~}
hello~world~~~Ha
👉⚡️echo ${str##*~}
Ha

說明:

  • # :截取尾部的字符串,類似於正則中的懶惰匹配法
  • *~: 實際上表的是hello~的替代寫法,* 代指任意多個字符,相當於正則中的“.*"的作用
  • ## :也是截取尾部的字符串,類似於正則中的貪婪匹配法
2.2, 右邊開始匹配
  • % :最小限度獲取頭部子字符串
  • %%:最大限度獲取頭部字符串

案例:

👉⚡️str="hello~world~~~la,la"
👉⚡️echo ${str%la,la}
hello~world~~~

# "~"此時是在左邊的,因為匹配的順序變了
👉⚡️echo ${str%~la,la}
hello~world~~
👉⚡️echo ${str%~~*}
hello~world~

說明:

  • %: 懶惰匹配法
  • %%: 貪婪匹配法
  • %,%% 都是從字符串的右邊開始進行匹配,然后截取左邊沒有匹配到的那些字符串。

3, 通過下標的方式獲取

3.1, 格式
${str:start:len}

說明:

  • str : 表示被截取的字符串
  • start: 下標
    • 0,1,2,,,n ,表示從左邊開始取
    • 0-start: 則表示從右邊開始取start個字符串,此時len就不需要了
  • len: 可選,表示需要截取的字符串長度

案例:

👉⚡️str="hello~world~~~la,la"
👉⚡️echo ${str:0:2}
he
👉⚡️echo ${str:2}
llo~world~~~la,la
👉⚡️echo ${str:2:5}
llo~w
👉⚡️

👉⚡️echo ${str:0-2}
la
👉⚡️echo ${str:0-2:6}
la
👉⚡️echo ${str:0-5}
la,la
👉⚡️

說明:

  • ${str:0-2:6} 和 ${str:0-2}表示的是一個意思,都是從字符串右邊開始取2個字符串。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM