给定一个字符串文件路径/foo/fizzbuzz.bar
,如何使用bash只提取fizzbuzz
所述字符串的一部分?
以下是使用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}
尾随部分匹配部分.
看一下basename命令:
NAME=$(basename /foo/fizzbuzz.bar .bar)
纯粹的bash,在两个单独的操作中完成:
从路径字符串中删除路径:
path=/foo/bar/bim/baz/file.gif file=${path##*/} #$file is now 'file.gif'
从路径字符串中删除扩展名:
base=${file%.*} #${base} is now 'file'.
使用basename我使用以下代码来实现此目的:
for file in *; do ext=${file##*.} fname=`basename $file $ext` # Do things with $fname done;
这不需要文件扩展名的先验知识,即使你的文件名在其文件名中有点(在它的扩展名前面),也可以工作; 它确实需要程序basename
,但这是GNU coreutils的一部分,所以它应该随附任何发行版.
纯粹的bash方式:
~$ x="/foo/bar/fizzbuzz.bar.quux.zoom"; ~$ y=${x/\/*\//}; ~$ echo ${y/.*/}; fizzbuzz
在"参数扩展"下的man bash中解释了此功能.非bash方式比比皆是:awk,perl,sed等.
编辑:在文件后缀中使用点,并且不需要知道后缀(扩展名),但不能使用名称本身中的点.
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