【问题标题】:UNIX remove characters from variableUNIX 从变量中删除字符
【发布时间】:2016-05-09 21:37:05
【问题描述】:

我想从输入字符串中删除最后 4 个字符,然后在 sed 命令中使用它。但我无法让它正常工作

newversion 是一个输入参数,它设置为:5.5.5-dev。 我想从输入参数中删除 -dev。

我尝试过的:

version=${$newversion::-4}
sed -i "s|\(<<some name i defined>>/$imagename:\)\([^\n]*\)|\1$version|" docker-compose.yml

错误:

错误替换

【问题讨论】:

  • 应该是version=${newversion::-4}。 (请注意,您使用了额外的$
  • newversion 从 Jenkins 构建中注入。所以 $newversion 是我使用的变量。在这种情况下我应该使用 $ 正确吗?
  • 不适用于parameter substitution
  • $newversion 只是${newversion} 的缩写,如果大括号内没有其他参数替换运算符,您可以使用它。

标签: linux unix sed sh


【解决方案1】:

sed 对于这个问题来说太过分了。要从任何 POSIX shell 中的字符串末尾删除 -dev,请使用

version=${newversion%-dev}

或更一般地

version=${newversion%-???}  # Remove the final - and the next 3 characters

甚至

version=${newversion%-*}  # Remove the final - and anything after it.

如果您使用的是bash(您似乎不是),那么您的第一次尝试很接近;你只是有一个额外的$。应该是

version=${newversion::-4}

虽然该位置的负值需要bash 4。在bash 3 中,您需要使用字符串的长度来计算值:

version=${newversion::${#newversion}-4}

【讨论】:

  • 赞成;但也许更清楚地强调 POSIX 替代方案,因为 OP 似乎使用的不是 Bash。一般来说,要从末尾删除四个字符,您可以使用${newversion%????}
  • @chepner 基本上你是对的。但看起来问题中的sed 命令用于更改文件,而不是用于更改版本号。
【解决方案2】:

如果 $newversion 包含“5.5.5-dev”。 即newversion="5.5.5-dev"

你为什么不试试 sed 删除 -dev。

version=`echo $newversion | sed "s/-dev//g"`

或者如果您使用的是bash

version=`sed "s/-dev//g"<<<$newversion`

【讨论】:

  • version=echo $newversion | sed "s/-dev//g" 似乎可以解决问题。我得到的唯一错误是:sed: -e expression #1, char 91: unknown option to `s'。 不兼容
  • 对不起,我没有提到,如果你使用 bash,你可以使用 "
【解决方案3】:
version="$(echo $newversion | sed 's/-dev//g')"
sed -i "s|\(<<some name i defined>>/$imagename:\)\([^\n]*\)|\1$version|" docker-compose.yml

原来我们需要将它包装在一个方法调用$() 中,这就是解决方案。在 Sudheesh shetty 的帮助下

【讨论】:

  • 如果您的问题得到解决,请在此处接受其中一个答案,而不是发布重复的答案。谢谢。
猜你喜欢
  • 2016-10-17
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-29
  • 2011-01-18
  • 1970-01-01
  • 2017-08-04
相关资源
最近更新 更多