如何从Bash中的路径字符串中删除文件后缀和路径部分?

十年热恋 提交于 2020-02-28 03:48:45

给定一个字符串文件路径(例如/foo/fizzbuzz.bar ,我将如何使用bash提取字符串中的fizzbuzz部分?


#1楼

看一下basename命令:

NAME=$(basename /foo/fizzbuzz.bar .bar)

#2楼

纯bash方式:

~$ x="/foo/bar/fizzbuzz.bar.quux.zoom"; 
~$ y=${x/\/*\//}; 
~$ echo ${y/.*/}; 
fizzbuzz

在man bash的“参数扩展”下解释了此功能。 非bash方式比比皆是:awk,perl,sed等。

编辑:使用文件后缀中的点,并且不需要知道后缀(扩展名),但不适用于名称本身中的点。


#3楼

perl -pe 's/\..*$//;s{^.*/}{}'

#4楼

basename和dirname函数是您所需要的:

mystring=/foo/fizzbuzz.bar
echo basename: $(basename "${mystring}")
echo basename + remove .bar: $(basename "${mystring}" .bar)
echo dirname: $(dirname "${mystring}")

输出:

basename: fizzbuzz.bar
basename + remove .bar: fizzbuzz
dirname: /foo

#5楼

这是使用Bash中的#和%运算符进行操作的方法。

$ x="/foo/fizzbuzz.bar"
$ y=${x%.bar}
$ echo ${y##*/}
fizzbuzz

${x%.bar}也可以是${x%.*}以删除点后的所有内容,或者${x%%.*}以删除第一个点后的所有内容。

例:

$ x="/foo/fizzbuzz.bar.quux"
$ y=${x%.*}
$ echo $y
/foo/fizzbuzz.bar
$ y=${x%%.*}
$ echo $y
/foo/fizzbuzz

文档可以在Bash手册中找到。 查找${parameter%word}${parameter%%word}尾部匹配部分。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!