UNIX从变量中删除字符

时间:2016-02-01 12:23:56

标签: linux unix sed sh

我想从输入字符串中删除最后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

错误:

糟糕的替换

3 个答案:

答案 0 :(得分:5)

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 :(得分: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`

答案 2 :(得分:0)

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

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