给定一个字符串文件路径,例如/foo/fizzbuzz。酒吧,我如何使用bash提取只是fizzbuzz部分说的字符串?


当前回答

纯粹的bash方式:

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

这个功能在man bash的“参数扩展”中有解释。非bash方法有很多:awk、perl、sed等等。

EDIT:用于文件后缀中的点,不需要知道后缀(扩展名),但不用于名称本身中的点。

其他回答

看看basename命令:

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

指示它删除后缀.bar,结果是NAME=fizzbuzz

纯粹的bash方式:

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

这个功能在man bash的“参数扩展”中有解释。非bash方法有很多:awk、perl、sed等等。

EDIT:用于文件后缀中的点,不需要知道后缀(扩展名),但不用于名称本身中的点。

使用basename假设您知道文件扩展名是什么,不是吗?

而且我相信各种正则表达式建议不能处理包含多个“”的文件名。

下面的内容似乎可以解决双点问题。哦,还有本身包含“/”的文件名(只是为了好玩)

用帕斯卡尔的话来说,“对不起,这个脚本太长了。我没有时间把它缩短。”


  #!/usr/bin/perl
  $fullname = $ARGV[0];
  ($path,$name) = $fullname =~ /^(.*[^\\]\/)*(.*)$/;
  ($basename,$extension) = $name =~ /^(.*)(\.[^.]*)$/;
  print $basename . "\n";
 

使用basename我使用以下方法来实现这一点:

for file in *; do
    ext=${file##*.}
    fname=`basename $file $ext`

    # Do things with $fname
done;

这不需要对文件扩展名的先验知识,即使你的文件名中有点(在它的扩展名前面)也可以工作;虽然它确实需要程序基名,但这是GNU coreutils的一部分,所以它应该随任何发行版一起发布。

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