UNIX从variables中删除字符

我想从inputstring中删除最后4个字符,然后在sed命令中使用它。 但是我不能让它正常工作

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

我曾经尝试过:

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

错误:

坏的替代

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} 

如果$ 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 -i "s|\(<<some name i defined>>/$imagename:\)\([^\n]*\)|\1$version|" docker-compose.yml 

原来我们需要用一个方法调用$()解决这个问题。 在Sudheesh shetty的帮助下