有没有方便的方法从文件名中删除任意扩展名,例如点击${i%%.*}
?我是否坚持我的朋友sed
?
答案 0 :(得分:9)
不。 fish比bash具有更小的功能集,依赖于外部命令:
$ set filename foo.bar.baz
$ set rootname (echo $filename | sed 's/\.[^.]*$//')
$ echo $rootname
foo.bar
答案 1 :(得分:8)
如果您知道扩展名(例如_bak,一个常见的用例),这可能更方便:
for f in (ls *_bak)
mv $f (basename $f _bak)
end
答案 2 :(得分:4)
使用内置string match
功能的鱼可以做到
set rootname (string match -r "(.*)\.[^\.]*\$" $filename)[2]
字符串匹配返回2个项目的列表。第一个是整个字符串,第二个是第一个正则表达式匹配(正则表达式中括号内的东西)。所以,我们用[2]抓住第二个。
答案 3 :(得分:1)
fish OneOffMembers
命令仍然是处理此问题的规范方法。它有一些非常不错的子命令,尚未在其他答案中显示。
AddContact
可让您从右侧分裂,最大为1,这样就可以得到最后一个扩展名。
string
split
使您可以使用正则表达式终止扩展名,该扩展名定义为字符串末尾的最后一个点。
for f in *
echo (string split -m1 -r '.' "$f")[1]
end
replace
了解更多信息和一些出色的示例。
答案 4 :(得分:1)
您可以使用string命令从文件名中删除扩展名:
echo (string split -r -m1 . $filename)[1]
这将在最右边的点处拆分filename
并打印结果列表的第一个元素。如果没有点,则该列表将包含带有filename
的单个元素。
如果您还需要剥离主要目录,请将其与基本名称结合使用:
echo (basename $filename | string split -r -m1 .)[1]
在此示例中,string
从stdin读取其输入,而不是将文件名作为命令行参数传递。