Bash将中间小数点替换为破折号

Bash将中间小数点替换为破折号,bash,Bash,我希望在bash脚本中将格式为8.0.3.0的变量更改为8.0-3.0 所以它始终是破折号的中间小数点 最有效的方法是什么?使用GNU sed可以在替换后加上要替换的匹配项: $ echo "a.b.c.d" | sed 's/\./-/2' a.b-c.d 使用GNU-sed您可以用要替换的匹配项的出现作为替换后缀: $ echo "a.b.c.d" | sed 's/\./-/2' a.b-c.d 如果您有大量数据要处理,可能值得尝试此解决方案,它不那么简洁,但避免调用外部程序,使用内部

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

所以它始终是破折号的中间小数点


最有效的方法是什么?

使用
GNU sed
可以在替换后加上要替换的匹配项:

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

使用
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

如果您有大量数据要处理,可能值得尝试此解决方案,它不那么简洁,但避免调用外部程序,使用内部匹配,因此可能会更快

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
您可以这样使用:

v="8.0.3.0"
echo "${v%*.*.*}-${v#*.*.}"
您可以这样使用:

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

如果选择awk

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

如果选择awk

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


我会使用awk而不是内置的bash字符串处理。在“.”上拆分,然后重新生成字符串。您能告诉我们更多的情况吗?如果数字超过4怎么办?输出应该是什么样的?我将使用awk而不是内置的bash字符串处理。在“.”上拆分,然后重新生成字符串。您能告诉我们更多的情况吗?如果数字超过4怎么办?输出应该是什么样的?只需直接使用
测试的退出代码
[$string=~^([0-9])[.]([0-9])[.]([0-9])[.]([0-9])$]&&printf“%s\n”${BASH_REMATCH[1]}.${BASH_REMATCH[2]-${BASH_REMATCH[3].${BASH_REMATCH[4]};echo“在这种情况下,任何人都可以做(1241))一旦错误处理必须安装在同一行上,它的可读性将大大降低,(2)甚至会变得不可读。我倾向于在结果表达式很容易适合一行(通常是)时使用逻辑运算符,否则使用
if
块。此外,不需要使用
newstring
临时变量@当然,如果用户不想保留旧值,或者只想打印结果,则不需要新变量。@123这在很大程度上取决于用例。对于低数据量,避免外部调用更快,但可能并不重要。对于大量数据,如果只需一次调用
sed
或另一个实用程序就可以完成这一切,那么它很可能会更快。但是,如果出于某种原因,每次迭代都需要调用一次外部程序,那么纯shell解决方案可能会获胜。如果性能真的很重要,那么执行测试的最佳方法就是直接使用
测试的退出代码
[$string=~^([0-9])[.]([0-9])[.]([0-9])[.]([0-9])[.]([0-9])]&&printf“%s\n”“${BASH_REMATCH[1]}.${BASH_REMATCH[2]-${BASH_REMATCH[3].${BASH_REMATCH[4]};echo”在这种情况下,任何人都可以做到这一点一旦错误处理必须安装在同一行上,它的可读性将大大降低,(2)甚至会变得不可读。我倾向于在结果表达式很容易适合一行(通常是)时使用逻辑运算符,否则使用
if
块。此外,不需要使用
newstring
临时变量@当然,如果用户不想保留旧值,或者只想打印结果,则不需要新变量。@123这在很大程度上取决于用例。对于低数据量,避免外部调用更快,但可能并不重要。对于大量数据,如果只需一次调用
sed
或另一个实用程序就可以完成这一切,那么它很可能会更快。但是,如果出于某种原因,每次迭代都需要调用一次外部程序,那么纯shell解决方案可能会获胜。如果性能真的很重要,那么执行测试的最佳方法就是。这正是我复制粘贴的内容,即将作为答案发布。但对于5位数字编号,
string=“8.0.3.2.1”;echo“${v%*.*.*}-${v#*.*.}”8.0-3.0
。没有发布,等待OP的澄清!OP至今没有提供5位数版本的模式,他们也没有提出要求。另外,他们也不太可能想要任何版本号的通用解决方案,因为版本号是一个非常特定于项目的东西。这正是我粘贴的副本,即将作为答案发布。但对于5位数字编号,
string=“8.0.3.2.1”;echo“${v%*.*.*}-${v#*.*.}”8.0-3.0
。没有发布,等待OP的澄清!OP至今没有提供5位数版本的模式,他们也没有提出要求。另外,他们不太可能想要任何版本号的通用解决方案,因为版本号是一个非常特定于项目的东西。这非常有效,但我接受了另一个解决方案,因为它不需要运行echo或sed-谢谢though@MikeLothian当然,没问题。谢谢你的反馈!这非常有效,但我接受了另一个解决方案,因为它不需要运行echo或sed-谢谢though@MikeLothian当然,没问题。谢谢你的反馈!