UNIX从变量中删除字符

leg*_*aat 3 unix linux 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
Run Code Online (Sandbox Code Playgroud)

错误:

糟糕的替代

che*_*ner 5

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

version=${newversion%-dev}
Run Code Online (Sandbox Code Playgroud)

或更一般地说

version=${newversion%-???}  # Remove the final - and the next 3 characters
Run Code Online (Sandbox Code Playgroud)

甚至

version=${newversion%-*}  # Remove the final - and anything after it.
Run Code Online (Sandbox Code Playgroud)

如果你正在使用bash(你似乎没有),你的第一次尝试就很接近; 你只需要一个额外的$.它应该是

version=${newversion::-4}
Run Code Online (Sandbox Code Playgroud)

虽然该位置的负值需要bash4.在bash3中,您需要使用字符串的长度来计算值:

version=${newversion::${#newversion}-4}
Run Code Online (Sandbox Code Playgroud)


sud*_*tty 2

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

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

version=`echo $newversion | sed "s/-dev//g"`
Run Code Online (Sandbox Code Playgroud)

或者如果您正在使用bash

version=`sed "s/-dev//g"<<<$newversion`
Run Code Online (Sandbox Code Playgroud)