给定一个字符串文件路径,例如/foo/fizzbuzz。酒吧,我如何使用bash提取只是fizzbuzz部分说的字符串?
当前回答
纯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。
注意建议的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,如果你知道扩展名的话)要简单得多。
perl -pe 's/\..*$//;s{^.*/}{}'
纯粹的bash方式:
~$ x="/foo/bar/fizzbuzz.bar.quux.zoom";
~$ y=${x/\/*\//};
~$ echo ${y/.*/};
fizzbuzz
这个功能在man bash的“参数扩展”中有解释。非bash方法有很多:awk、perl、sed等等。
EDIT:用于文件后缀中的点,不需要知道后缀(扩展名),但不用于名称本身中的点。
你可以使用
mv *<PATTERN>.jar "$(basename *<PATTERN>.jar <PATTERN>.jar).jar"
例如:-我想从我的文件名中删除- snapshot。用于下面的命令
mv *-SNAPSHOT.jar "$(basename *-SNAPSHOT.jar -SNAPSHOT.jar).jar"