Bash 从修订字符串派生上一个编号

Bash 从修订字符串派生上一个编号,bash,shell,unix,awk,scripting,Bash,Shell,Unix,Awk,Scripting,但不要为以下目标工作: #bash shell new="r.9.9.10.6.00999" new_ver=${new##*[!1-9]}; prefix=${new%%$new_ver} old=${prefix}$((new_ver-1)) echo old=${old} ###prints old=r.9.9.10.6.00998 由于新版本变为空,在这种情况下,获取以前版本的最佳方法是什么?这比您的解决方案稍微不那么脆弱: new="r.9.9.10.6.00

但不要为以下目标工作:

  #bash shell
  new="r.9.9.10.6.00999"
  new_ver=${new##*[!1-9]}; prefix=${new%%$new_ver}
  old=${prefix}$((new_ver-1))
  echo old=${old} ###prints old=r.9.9.10.6.00998

由于新版本变为空,在这种情况下,获取以前版本的最佳方法是什么?

这比您的解决方案稍微不那么脆弱:

  new="r.9.9.10.6.00100" #need to make old=r.9.9.10.6.00099
  new="r.9.9.10.6.01000" #need to make old=r.9.9.10.6.00999
将输入和输出字段分隔符设置为

对于每行,选择最后一个字段

捕获最后一个字段的长度,以便保持不变

从值中减去1

设置新值,确保在需要时使用正确的数字0作为前缀

打印修改行

你的${new*[!1-9]}真的应该是${new*[!0-9]}吗?当然,我更喜欢IFS=。阅读x new_\n无论你是否正确,但00999-1的工作方式与999-1不同,而且如果我这样做,我也不必在0前面加前缀[!1-9],总之它不起作用,我现在正在使用Steven Penny的解决方案,谢谢。
awk 'BEGIN {FS = OFS = "."} {$NF = sprintf("%0*d", length($NF), --$NF)} 1'