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


当前回答

将排名第一的答案与排名第二的答案结合起来,得到没有完整路径的文件名:

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

其他回答

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

如果你不能像其他文章中建议的那样使用basename,你总是可以使用sed。这里有一个(丑陋的)例子。它不是最好的,但它的工作原理是提取所需的字符串并将输入替换为所需的字符串。

echo '/foo/fizzbuzz.bar' | sed 's|.*\/\([^\.]*\)\(\..*\)$|\1|g'

哪一个会得到输出

嘶嘶声

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

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

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

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


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

纯bash,在两个独立的操作中完成:

从路径字符串中移除路径: 路径= / foo / bar / bim /巴兹/ file.gif 路径文件= $ {# # * /} #$file现在是file.gif 从路径字符串中移除扩展名: 基础= ${文件%。*} #${base}现在是“文件”。

下面是如何在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。