给定一个字符串文件路径,例如/foo/fizzbuzz。酒吧,我如何使用bash提取只是fizzbuzz部分说的字符串?
当前回答
使用basename假设您知道文件扩展名是什么,不是吗?
而且我相信各种正则表达式建议不能处理包含多个“”的文件名。
下面的内容似乎可以解决双点问题。哦,还有本身包含“/”的文件名(只是为了好玩)
用帕斯卡尔的话来说,“对不起,这个脚本太长了。我没有时间把它缩短。”
#!/usr/bin/perl
$fullname = $ARGV[0];
($path,$name) = $fullname =~ /^(.*[^\\]\/)*(.*)$/;
($basename,$extension) = $name =~ /^(.*)(\.[^.]*)$/;
print $basename . "\n";
其他回答
使用basename假设您知道文件扩展名是什么,不是吗?
而且我相信各种正则表达式建议不能处理包含多个“”的文件名。
下面的内容似乎可以解决双点问题。哦,还有本身包含“/”的文件名(只是为了好玩)
用帕斯卡尔的话来说,“对不起,这个脚本太长了。我没有时间把它缩短。”
#!/usr/bin/perl
$fullname = $ARGV[0];
($path,$name) = $fullname =~ /^(.*[^\\]\/)*(.*)$/;
($basename,$extension) = $name =~ /^(.*)(\.[^.]*)$/;
print $basename . "\n";
看看basename命令:
NAME="$(basename /foo/fizzbuzz.bar .bar)"
指示它删除后缀.bar,结果是NAME=fizzbuzz
注意建议的perl解决方案:它删除第一个点之后的任何内容。
$ echo some.file.with.dots | perl -pe 's/\..*$//;s{^.*/}{}'
some
如果你想用perl来做,这是可行的:
$ echo some.file.with.dots | perl -pe 's/(.*)\..*$/$1/;s{^.*/}{}'
some.file.with
但如果使用Bash,则y=${x%。*}(或者basename "$x" .ext,如果你知道扩展名的话)要简单得多。
如果您想只保留带扩展名的文件名并删除文件路径
$ x="myfile/hello/foo/fizzbuzz.bar"
$ echo ${x##*/}
$ fizzbuzz.bar
Bash手册中的解释,请参见${parameter##word}
将排名第一的答案与排名第二的答案结合起来,得到没有完整路径的文件名:
$ x="/foo/fizzbuzz.bar.quux"
$ y=(`basename ${x%%.*}`)
$ echo $y
fizzbuzz