在我的 shell 腳本中,有一個來自某些系統的引數,它給出了與此類似的答案:PAR0000008。而且我只需要將此引數的最后一個數字發送到另一個變數,即 VAR=8。我使用了這個命令VAR=$( echo ${PAR} | cut -c 10 ),它作業得很好。問題是當 PAR 引數回傳兩個小數位的數字時,如 PAR0000012。我需要丟棄前導零并僅將數字 12 發送到變數,但我不知道如何在 Shell 中執行邏輯以丟棄數字左側的所有字符。
uj5u.com熱心網友回復:
編輯使用grep將 0 作為最終數字的一部分處理
由于您使用的是 POSIX shell,因此使用像sedor grep(or cut)這樣的實用程式是有意義的。grep在決議字串時更加靈活,允許 REGEX 匹配來處理作業。說你的變數v=PAR0312012,你想要結果r=312012。您可以使用命令替換(例如$(...))來決議將結果分配給的值r,例如
v=PAR0312012
r=$(echo $v | grep -Eo '[1-9].*$')
echo $r
該grep運算式為:
-Eo- 使用擴展正則運算式并只回傳字串的匹配部分,[1-9].*$- 從第一個字符開始[1-9]回傳字串的其余部分。
這將適用于PAR0000012或PAR0312012(結果312012)。
結果
為了 PAR0312012
312012
另一種解決方案使用 expr
如果您的變數可以將零作為最終數字部分的一部分,那么您必須找到第一個[1-9]字符出現的索引,然后將從該索引開始的子字串分配給您的結果變數。
POSIX shell 提供expr了一組可以對此進行決議的字串決議工具。需要的命令是:
expr index string charlist
和
expr substr string start end
哪里start和end是從字串中提取的開始和結束索引。end只需足夠長以包含整個子字串,因此您可以只使用字串的總長度,例如
v=PAR0312012
ndx=$(expr index "$v" "123456789")
r=$(expr substr "$v" "$ndx" 10)
echo $r
結果
312012
這將0在第一個[1-9].
(注意:舊expr ...的不是處理這個問題的最快方法,但如果你只關心幾萬個值,它會作業得很好。可能需要十億個數字和另一種方法)
uj5u.com熱心網友回復:
這可以使用Parameter Expension輕松完成。
var='PAR0000008'
echo "${var##*0}"
//prints 8
echo "${var##*[^1-9]}"
//prints 8
var="${var##*0}"
echo "$var"
//prints 8
var='PAR0000012'
echo "${var##*0}"
//prints 12
echo "${var##*[^1-9]}"
//prints 12
var="${var##*[^1-9]}"
echo "$var"
//prints 12
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/331202.html
上一篇:使用特殊字符顯示檔案名
