此问题在此处已有答案:
Extract filename and extension in Bash(38个答案)
6年前关闭。
给定文件名如下:
/the/path/foo.txt
bar.txt
字符串
我希望得到:
foo
bar
型
为什么这个不管用?
#!/bin/bash
fullfile=$1
fname=$(basename $fullfile)
fbname=${fname%.*}
echo $fbname
型
怎么做才是正确的呢?
此问题在此处已有答案:
Extract filename and extension in Bash(38个答案)
6年前关闭。
给定文件名如下:
/the/path/foo.txt
bar.txt
字符串
我希望得到:
foo
bar
型
为什么这个不管用?
#!/bin/bash
fullfile=$1
fname=$(basename $fullfile)
fbname=${fname%.*}
echo $fbname
型
怎么做才是正确的呢?
9条答案
按热度按时间lp0sw83n1#
您不必调用外部
basename
命令。相反,您可以使用以下命令:字符串
请注意,此解决方案应该在所有最近的(post 2004)POSIX 兼容shell中工作(例如
bash
、dash
、ksh
等)。来源:Shell Command Language 2.6.2参数扩展
更多关于bash String Manipulations:http://tldp.org/LDP/LG/issue18/bash.html
fwzugrvs2#
basename命令有两种不同的调用;在一种情况下,你只指定路径,在这种情况下,它会给你最后一个组件,而在另一种情况下,你也会给一个后缀,它会删除。因此,您可以通过使用basename的第二次调用来简化示例代码。另外,要注意正确引用:
字符串
puruo6ea3#
basename和cut的组合可以很好地工作,即使是像
.tar.gz
这样的双结尾:字符串
如果这个解决方案需要比Bash参数扩展更少的算术能力,那将是有趣的。
5uzkadbs4#
以下是oneliners:
1.第一个月
$(basename "${s}" ".${s##*.}")
个我需要这个,就像bongbang和w4etwetwtwtwet问的一样。
示例如下:
字符串
axzmvihb5#
纯
bash
,没有basename
,没有变量杂耍。设置一个字符串和echo
:字符串
输出量:
型
注意:
bash
extglob选项必须为“on”,(Ubuntu 默认设置extglob为“on”),如果不是,请执行:型
走进
${p//+(*\/|.*)}
:${p
--以 $p 开头。//
替换以下模式的每个示例。+(
匹配括号中的 * 模式列表 * 中的 * 一个或多个 ,( 即 * 直到下面的项目#7)。1.* 第一 * 图案:
*\/
匹配文字“/
“char之前的任何内容。1.模式分隔符
|
,在这种情况下,它的作用类似于logical OR。1.* 第二 * 图案:
.*
匹配文字“.
”之后的任何内容-也就是说,在bash
中,“.
”只是一个句点字符,而 * 不是 * a regex dot。)
end pattern list.}
结束参数展开。对于字符串替换,通常会有另一个/
,后跟一个替换字符串。但由于没有/
,匹配的模式被替换为空;这将删除匹配。相关
man bash
背景:1.* 模式替换 *:
型
1.* 扩展模式匹配 *:
型
fzsnzjdm6#
下面是另一种(更复杂)获取文件名或扩展名的方法,首先使用
rev
命令反转文件路径,从第一个.
开始剪切,然后再次反转文件路径,如下所示:字符串
sg24os4d7#
如果你想玩好Windows文件路径(在Cygwin下),你也可以试试这个:
字符串
这将说明在Windows上使用BaSH时的反斜杠分隔符。
tkclm6bt8#
只是一个替代方案,我想出了提取一个扩展,使用帖子在这个线程与我自己的小知识库,这是我更熟悉。
字符串
注:请对我的报价使用建议;它对我很有效,但我可能在它们的正确使用上遗漏了一些东西(我可能用得太多了)。
lyfkaqu19#
使用basename命令。它的manpage在这里:http://unixhelp.ed.ac.uk/CGI/man-cgi?basename