将 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##*/}"
我需要作为参数提供给 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##*/}"