将 basename 的输出管道化为字符串替换

Pipe the output of basename to string substitution

我需要作为参数提供给 bash 脚本的文件的基本名称。基本名称应该去掉其文件扩展名。 假设 = "/somefolder/andanotherfolder/myfile.txt",所需的输出将是 "myfile"

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

BASE=$(basename "")
NOEXT="${BASE%.*}"

我试图使它成为一个单行的尝试是管道 basename 的输出。但是,我不知道如何将 stdout 通过管道传输到字符串替换。

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

怎么样:

$ [[ $var =~ [^/]*$ ]] && echo ${BASH_REMATCH%.*}
myfile
NOEXT="${1##*/}"; NOEXT="${NOEXT%.*}"

为什么不是 Zoidberg? 嗯..我的意思是为什么不在使用 basename 之前删除分机?

basename "${1%.*}"

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

echo $(basename "") | awk 'BEGIN { FS = "." }; { print  }'

awk 解决方案将删除文件名第一个点后的 任何内容

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

echo $(basename "") | sed 's/\(.*\)\..*//'

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

echo $(basename "") | sed 's/\(.*\)\.[[:alnum:]]\{3\}$//'

这个怎么样?

NEXT="$(basename -- "${1%.*}")"

测试:

set -- '/somefolder/andanotherfolder/myfile.txt'
NEXT="$(basename -- "${1%.*}")"
echo "$NEXT"

myfile

或者:

set -- "${1%.*}"; NEXT="${1##*/}"