在我的 shell 腳本中,有一個來自某些系統的參數,它給出了與此類似的答案:PAR0000008。而且我只需要將此參數的最後一個數字發送到另一個變量,即 VAR=8。我使用了這個命令VAR=$( echo ${PAR} | cut -c 10 )
,它工作得很好。問題是當 PAR 參數返回兩個小數位的數字時,如 PAR0000012。我需要丟棄前導零並僅將數字 12 發送到變量,但我不知道如何在 Shell 中執行邏輯以丟棄數字左側的所有字符。
編輯使用grep
將 0 作為最終數字的一部分處理
由於您使用的是 POSIX shell,因此使用像sed
or 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 ...
的不是處理這個問題的最快方法,但如果你只關心幾萬個值,它會工作得很好。可能需要十億個數字和另一種方法)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句