2017-07-06 112 views
0

我創建了一個while循環,當它達到特定版本時停止。 問題是,如果我有版本1.1.4,並想要下降到1.0.9,我發現在這個論壇上的命令我的awk並不好。減少版本號

我使用的是這樣的:

while compare versions; do 

    current version= 

    if [[ actual version != current version ]]; then 

     currentver= 

     previous version=`echo $ current version | awk -F. -v OFS=. \ 
       'NF==1{print ++$NF}; 
       NF>1{if(length($NF+1)>length($NF))$(NF-1)++; 
       $NF=sprintf("%0*d", length($NF), ($NF-1)%(10^length($NF))); 
       print}'` 

     Go back to $ previous version 

     do something 

我得到的是:

Go back to 1.1.4 

Go back to 1.1.3 

Go back to 1.1.2 

Go back to 1.1.1 

Go back to 1.1.0 

Go back to 1.1.-1 

Go back to 1.1.-2 

我想要的版本號要到1.0.9。

如何更改awk命令不低於0?

+1

但是,如果1.0.10存在呢? –

+1

請澄清目標是用點分隔的數字倒數還是使用已知版本的列表進行倒數計數(可能從* changelog *文件中提取)。 – agc

回答

0

bashsed

echo "version_1."{104..099} | sed 's/ /\n/g' | sed 's/.\(.$\)/.\1/g;y/_/ /' 

輸出:

version 1.1.4 
version 1.1.3 
version 1.1.2 
version 1.1.1 
version 1.1.0 
version 1.0.9 

另一個類似的方法:

echo "version_"{114..109} | sed 's/ /\n/g;y/_/ /;s/\([0-9]\)\([0-9]\)/\1.\2./g' 
0

你的問題是不明確的,所以如果這個ISN你想要什麼:

$ cat tst.awk 
function decrement(old,  n,parts) { 
    n = split(old,parts,/\./) 
    if (parts[n] == 0) { 
     parts[n--] = 9 
    } 
    parts[n]-- 
    return (parts[1] "." parts[2] "." parts[3]) 
} 
BEGIN { 
    val = "1.1.4" 
    while (val != "1.0.9") { 
     print val 
     val = decrement(val) 
    } 
    print val 
} 

$ awk -f tst.awk 
1.1.4 
1.1.3 
1.1.2 
1.1.1 
1.1.0 
1.0.9 

然後編輯你的問題,以澄清你想要做什麼,並提供可測試的樣本輸入/輸出。

+0

這是我想要的,我可以使用$ current版本和1.0.9到$ target版本替換1.1.4。但我希望它能夠在shell腳本中工作,而這不是。 –

+0

當然是的。再一次,如果它沒有做到你想要的,那麼你將不得不編輯你的問題來澄清這是什麼。 –