UNIX从变量中删除字符

5
我希望您能够从输入字符串中删除最后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

错误信息:
替代错误。

2
应该是 version=${newversion::-4}。请注意,您多使用了一个 $ 符号。 - hek2mgl
新版本从 Jenkins 构建中注入。所以 $newversion 是我使用的变量。在这种情况下,我应该使用 $ 对吗? - legopiraat
不适用于参数替换 - hek2mgl
$newversion 只是 ${newversion} 的简写,如果花括号内没有出现其他参数替换运算符,您可以使用它。 - chepner
3个回答

8

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}

1
已点赞;但是可能需要更清楚地强调POSIX的替代方案,因为原帖似乎在使用Bash之外的东西。通常,要从末尾删除四个字符,可以使用${newversion%????} - tripleee
@chepner基本上你是对的。但是看起来问题中的sed命令是用于更改文件,而不是更改版本号。 - hek2mgl

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`

版本=echo $newversion | sed "s/-dev//g" 看起来几乎可以解决问题。我唯一得到的错误是:sed: -e 表达式 #1,字符 91:未知选项`s'。<<< 方法与 sh 不兼容。 - legopiraat
抱歉我没有提到,如果你使用的是bash,你可以选择第二个选项"<<<"。否则,请选择第一个选项。 - sudheesh shetty

0
version="$(echo $newversion | sed 's/-dev//g')"
sed -i "s|\(<<some name i defined>>/$imagename:\)\([^\n]*\)|\1$version|" docker-compose.yml

结果发现我们需要将其包装在一个方法调用$()中,这就是解决方案。在Sudheesh Shetty的帮助下完成。


如果您的问题已经解决,请接受这里的一个答案,而不是发布重复的答案。谢谢。 - tripleee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接