将基本名称的输出通过管道传输到字符串替换

ste*_*tee 3 bash file-extension pipe string-substitution basename

我需要作为 bash 脚本的参数给出的文件的基本名称。基本名称应去掉其文件扩展名。让我们假设$1 = "/somefolder/andanotherfolder/myfile.txt",期望的输出是"myfile"。

当前的尝试创建了一个我想避免的中间变量:

BASE=$(basename "$1")
NOEXT="${BASE%.*}"
Run Code Online (Sandbox Code Playgroud)

我尝试将其作为单行代码,通过管道输出 basename 的输出。但是,我不知道如何将标准输出传输到字符串替换。

编辑:这需要适用于可能具有不同长度的多个文件扩展名,因此字符串替换尝试如上所述。

Ors*_*ong 5

为什么不是佐伊德伯格?嗯..我的意思是为什么不在使用 basename 之前删除 ext ?

basename "${1%.*}"
Run Code Online (Sandbox Code Playgroud)

当然,除非您的目录路径带有点,否则您必须先使用基本名称,然后再删除扩展名:

echo $(basename "$1") | awk 'BEGIN { FS = "." }; { print $1 }'
Run Code Online (Sandbox Code Playgroud)

awk 解决方案将删除文件名中第一个点之后的所有内容。

有一个基于正则表达式的解决方案,它使用 sed 仅删除最后一个点后面的扩展名(如果存在):

echo $(basename "$1") | sed 's/\(.*\)\..*/\1/'
Run Code Online (Sandbox Code Playgroud)

如果您确定拥有 3-4 个字符的字母数字扩展名(例如:mp3、mpeg、jpg、txt、json...),这甚至可以得到改进

echo $(basename "$1") | sed 's/\(.*\)\.[[:alnum:]]\{3\}$/\1/'
Run Code Online (Sandbox Code Playgroud)