[英]How to convert a semantic version shell variable to a shifted integer?
給定一個值為語義版本的 shell 變量,我如何創建另一個值為(tuple 1 × 1000000) + (tuple 2 × 1000) + (tuple 3)的 shell 變量?
例如
$ FOO=1.2.3
$ BAR=#shell magic that, given ${FOO} returns `1002003`
# Shell-native string-manipulation? sed? ...?
我不清楚 POSIX 合規性與特定於 shell 的語法如何在這里發揮作用,但我認為首選不是特定於 bash 的解決方案。
更新:澄清一下:這並不像用零替換“ .
”那么簡單,這是我最初的想法。
例如,1.12.30 所需的1.12.30
是1012030
,而不是100120030
,這是什么.
-替代方法可能會提供。
如果答案可以是單行變量賦值,則獎勵。
A perl 單線:
echo $FOO | perl -pne 's/\.(\d+)/sprintf "%03d", $1/eg'
這個怎么運作:
perl -pne
使用提供的程序執行REPLs///
\.(\d+)
匹配以點開頭並以數字結尾的字符串並捕獲這些數字s///
function 的e
修飾符將 s/// 替換s///
右側計算為表達式。 由於我們捕獲了數字,它們將被轉換為 int 並使用sprintf格式化為前導零g
修飾符替換輸入字符串中正則表達式的所有實例在點上拆分,然后循環並乘/加:
version="1.12.30"
# Split on dots instead of spaces from now on
IFS="."
# Loop over each number and accumulate
int=0
for n in $version
do
int=$((int*1000 + n))
done
echo "$version is $int"
請注意,這將 1.2 和 0.1.2 視為相同。 如果您想始終將第一個數字視為主要/百萬,請事先考慮填充/截斷。
這應該這樣做
echo $foo | sed 's/\./00/g'
這個怎么樣?
$ ver=1.12.30
$ foo=$(bar=($(echo $ver|sed 's/\./ /g')); expr ${bar[0]} \* 1000000 + ${bar[1]} \* 1000 + ${bar[2]})
$ echo $foo
1012030
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.