簡體   English   中英

如何將語義版本 shell 變量轉換為移位的 integer?

[英]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.301012030 ,而不是100120030 ,這是什么. -替代方法可能會提供。


如果答案可以是單行變量賦值,則獎勵。

A perl 單線:

echo $FOO | perl -pne 's/\.(\d+)/sprintf "%03d", $1/eg'

這個怎么運作:

  • perl -pne使用提供的程序執行REPL
  • 程序包含替換 function s///
    • 搜索字符串是正則表達式\.(\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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM