给定一个字符串文件路径,例如/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。

其他回答

如果您想只保留带扩展名的文件名并删除文件路径

$ x="myfile/hello/foo/fizzbuzz.bar"
$ echo ${x##*/}
$ fizzbuzz.bar

Bash手册中的解释,请参见${parameter##word}

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

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

哪一个会得到输出

嘶嘶声

注意建议的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,如果你知道扩展名的话)要简单得多。

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

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