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


当前回答

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

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

哪一个会得到输出

嘶嘶声

其他回答

basename会移除路径。它还将删除给定的后缀,如果它与文件的后缀匹配,但您需要知道为命令提供的后缀。否则,你可以用mv,用其他方法找出新名称。

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

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

哪一个会得到输出

嘶嘶声

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

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

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

    # Do things with $fname
done;

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

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