给定一个字符串文件路径,例如/foo/fizzbuzz。酒吧,我如何使用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}后面部分匹配的section。
其他回答
使用basename假设您知道文件扩展名是什么,不是吗?
而且我相信各种正则表达式建议不能处理包含多个“”的文件名。
下面的内容似乎可以解决双点问题。哦,还有本身包含“/”的文件名(只是为了好玩)
用帕斯卡尔的话来说,“对不起,这个脚本太长了。我没有时间把它缩短。”
#!/usr/bin/perl
$fullname = $ARGV[0];
($path,$name) = $fullname =~ /^(.*[^\\]\/)*(.*)$/;
($basename,$extension) = $name =~ /^(.*)(\.[^.]*)$/;
print $basename . "\n";
纯粹的bash方式:
~$ x="/foo/bar/fizzbuzz.bar.quux.zoom";
~$ y=${x/\/*\//};
~$ echo ${y/.*/};
fizzbuzz
这个功能在man bash的“参数扩展”中有解释。非bash方法有很多:awk、perl、sed等等。
EDIT:用于文件后缀中的点,不需要知道后缀(扩展名),但不用于名称本身中的点。
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
如果您想只保留带扩展名的文件名并删除文件路径
$ x="myfile/hello/foo/fizzbuzz.bar"
$ echo ${x##*/}
$ fizzbuzz.bar
Bash手册中的解释,请参见${parameter##word}
perl -pe 's/\..*$//;s{^.*/}{}'