提取文件名并替换

提取文件名并替换

我从完整路径中提取文件名部分,如下所示:

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

相关内容