linux shell 字串獲取長度、替換、擷取、刪除等操作(持續更新)
測試字串:str=/xxx/file.txt.gz
一、長度、變數:
說明 | 表示式 | 例子 | 結果 |
獲取長度 | ${#string} | ${#str} | 16 |
列出所有以prefix開頭的變數 | ${!prefix*}、${!prefix@} | ${!st@} | str |
str111=/xxx/file.txt.gz
str222=/xxx/file.txt.gz
echo ${!str@} #結果:str111 str222
echo ${!str*} #結果:str111 str222
二、擷取、刪除
說明 | 表示式 | 例子 | 結果 |
從position(從0開始,負表示倒數,下同)開始擷取 | ${string:position} | ${str:1} | xxx/file.txt.gz |
position開始擷取,取length長 | ${string:position:length} | ${str:1:3} | xxx |
從第index(從1開始)開始,取number個 | `expr substr $string index number` | `expr substr $str 2 3` | xxx |
從左邊開始,刪最短匹配regex | ${string#regex } | ${str#*.} | txt.gz |
從左邊開始,刪最長匹配regex | ${string##regex } | ${str##*.} | gz |
從右邊開始,刪最長匹配regex | ${string%%regex } | ${str%%.*} | /xxx/file |
從右邊開始,刪最短匹配regex | ${string%regex } | ${str%.*} | /xxx/file.txt |
刪除操作很有用:比如取目錄、檔名、字尾等
dir=${str%/*} 在絕對路徑str取目錄
filename=${str##*/} 取檔名
suffix=${str##*.} 取字尾
很方便、很簡潔,有木有~~~~
三、匹配
說明 | 表示式 | 例子 | 結果 |
從頭匹配substring | `expr match $string '\(substring\)'` | `expr match $str '\(/xx\)'` | /xx |
隨便位置匹配substring | `expr match $string '.*\(substring/\)'` | `expr match $str '.*\(xx/\)'` | xx/ |
從頭匹配substring,輸出匹配數量 | `expr match $string 'substring'` | `expr match $str '/xx'` | 3 |
隨便位置匹配substring,輸出匹配數量 | `expr match $ string '.* 'substring''` | `expr match $str '.*xx/'` | 5 |
四、替換
說明 | 表示式 | 例子 | 結果 |
在string中,用newsubstr替換oldsubstr一次 | ${string/oldsubstr/newsubstr} | ${str/./-} | /xxx/file-txt.gz |
在string中,用newsubstr替換所有oldsubstr | ${string//oldsubstr/newsubstr} | ${str//./-} | /xxx/file-txt-gz |
在string中,以oldsubstr開頭部分被newsubstr替換 | ${string/#oldsubstr/newsubstr} | ${str/#\/x/y} | yxx/file.txt.gz |
在string中,以oldsubstr結尾部分被newsubstr替換 | ${string/%oldsubstr/newsubstr} | ${str/%gz/tar} | /xxx/file.txt.tar |