鱼壳:是否可以方便地剥离延伸?

时间:2015-06-03 09:17:28

标签: fish

有没有方便的方法从文件名中删除任意扩展名,例如点击${i%%.*}?我是否坚持我的朋友sed

5 个答案:

答案 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读取其输入,而不是将文件名作为命令行参数传递。