我从完整路径中提取文件名部分,如下所示:
PATH=/a/b/c/foo.o #1
BASE=${PATH##*/} #2
BASE=${BASE/%.o/-1234.o} #3
echo "$BASE"
有没有办法合并#2和#3?每当我尝试时,我都会bad substitution
从 bash 中收到某种错误
答案1
是的,您不能嵌套替换,因为它们都需要变量名。
不过,您可以通过一次调用来完成此操作basename
:
base="$( basename "$pathname" .o )-1234.o"
第二个参数basename
是将从给定字符串中删除的后缀。
另请注意,在 shell 脚本中使用大写字母PATH
作为变量是真是个坏主意,因为 shell 使用此变量来查找外部实用程序。
在脚本中使用小写变量名。这有助于避免与 shell 变量和 shell 用于其他用途的环境变量发生冲突。
答案2
如果文件扩展名未知(动态)-sed选择:
p="/a/b/c/foo.txt"
p=$(sed -E 's#.*/([^/]+)(\..*)$#\1-1234\2#' <<< "$p")
echo "$p"
foo-1234.txt