Bash 将小数点中间替换为短划线



我想在 bash 脚本中将格式为 8.0.3.0 的变量更改为 8.0-3.0

所以它总是小数点中间到破折号

最有效的

方法是什么?

您可以使用参数扩展,如下所示:

v="8.0.3.0"
echo "${v%*.*.*}-${v#*.*.}"

使用 GNU sed 您可以将替换后缀为您要替换的匹配项的出现:

$ echo "a.b.c.d" | sed 's/./-/2'
a.b-c.d

如果你有很多数据要处理,可能值得尝试这个解决方案,它不那么简洁,但避免调用外部程序,使用内部匹配,所以可能会更快。

string=8.0.3.0
if
  [[ $string =~ ^([0-9])[.]([0-9])[.]([0-9])[.]([0-9])$ ]]
then
  newstring="${BASH_REMATCH[1]}.${BASH_REMATCH[2]}-${BASH_REMATCH[3]}.${BASH_REMATCH[4]}"
else
  echo "ERROR: no match on $string"
fi

如果awk是一个选择

awk '$0 = gensub( /./, "-", 2 )' file
8.0-3.0

最新更新