使用sed从Bash变量中删除子字符串(后缀)

使用sed从Bash变量中删除子字符串(后缀),bash,sed,Bash,Sed,我对Bash脚本和管道的掌握很薄弱,并且遇到了一个基于经验的有限期望与现实相冲突的情况。我想使用sed从Bash变量中删除一个子字符串(特别是后缀)。字符串和子字符串都是Bash变量 > foo1=foo.cpp > foo2=/main/bar/foo.cpp > foo3=$(echo $foo2 | sed 's/$foo1//') > echo $foo3 /main/bar/foo.cpp 如果在sed表达式中使用硬编码字符串代替$foo1,则表达式的行为符合

我对Bash脚本和管道的掌握很薄弱,并且遇到了一个基于经验的有限期望与现实相冲突的情况。我想使用sed从Bash变量中删除一个子字符串(特别是后缀)。字符串和子字符串都是Bash变量

> foo1=foo.cpp
> foo2=/main/bar/foo.cpp
> foo3=$(echo $foo2 | sed 's/$foo1//')
> echo $foo3
/main/bar/foo.cpp
如果在sed表达式中使用硬编码字符串代替$foo1,则表达式的行为符合要求:

> foo4=$(echo $foo2 | sed 's/foo\.cpp//')
> echo $foo4
/main/bar/
有人能指出我缺少什么使foo3评估工作正常,从而删除“foo.cpp”吗?谢谢。

GNU bash 4及其:

输出:

/main/bar/ /主/酒吧/
我试过在foo3表达式中双重引用foo1、foo2和两者;它不会更改foo3的结果值。请执行sed:
echo${foo2%%$foo1}
Thank you@sat。我会将此添加到我的Bash字符串操作技巧包中。谢谢@bishop。拧紧sed对我来说也是一个可行的解决方案。:)由于我对unixshell字符串操作的掌握不够,我常常不清楚字符串何时需要通过管道传输到辅助程序,何时可以由shell“本机”操作。 /main/bar/