如何从Bash中的路径字符串中删除文件后缀和路径部分?
时间:2020-03-06 14:38:28 来源:igfitidea点击:
给定一个字符串文件路径,例如" /foo/fizzbuzz.bar",我将如何使用bash提取字符串的" fizzbuzz"部分?
解决方案
看一下basename命令:
NAME=`basename /foo/fizzbuzz.bar .bar`
纯bash方式:
~$ x="/foo/bar/fizzbuzz.bar.quux.zoom"; ~$ y=${x/\/*\//}; ~$ echo ${y/.*/}; fizzbuzz
在man bash的"参数扩展"下解释了此功能。非bash方式比比皆是:awk,perl,sed等。
编辑:使用文件后缀中的点,并且不需要知道后缀(扩展名),但不适用于名称本身中的点。
perl -pe 's/\..*$//;s{^.*/}{}'
basename和dirname函数是我们所需要的:
mystring=/foo/fizzbuzz.bar echo basename: $(basename $mystring) echo basename + remove .bar: $(basename $mystring .bar) echo dirname: $(dirname $mystring)
输出:
basename: fizzbuzz.bar basename + remove .bar: fizzbuzz dirname: /foo
这是使用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}
尾部匹配部分。
使用basename
假设我们知道文件扩展名是不是?
而且我相信,各种正则表达式建议都不能解决一个文件名包含多个""的问题。
以下内容似乎可以解决双点问题。哦,文件名本身也包含" /"(仅用于踢)
用帕斯卡(Pascal)来解释:"很抱歉,这个脚本太长了。我没有时间将其缩短。"
#!/usr/bin/perl $fullname = $ARGV[0]; ($path,$name) = $fullname =~ /^(.*[^\]\/)*(.*)$/; ($basename,$extension) = $name =~ /^(.*)(\.[^.]*)$/; print $basename . "\n"; Answer If you can't use basename as suggested in other posts, you can always use sed. Here is an (ugly) example. It isn't the greatest, but it works by extracting the wanted string and replacing the input with the wanted string. echo '/foo/fizzbuzz.bar' | sed 's|.*\/\([^\.]*\)\(\..*\)$||g'
这将为我们提供输出
fizzbuzz
基本名称即会删除路径。如果给定后缀,并且与文件的后缀匹配,它也会删除后缀,但是我们需要知道后缀才能赋予命令。否则,我们可以使用mv并以其他方式找出新名称。
提防建议的perl解决方案:它会删除第一个点之后的所有内容。
$ echo some.file.with.dots | perl -pe 's/\..*$//;s{^.*/}{}' some
如果要使用perl进行操作,则可以使用以下方法:
$ echo some.file.with.dots | perl -pe 's/(.*)\..*$//;s{^.*/}{}' some.file.with
但是,如果我们使用的是Bash,则使用y = $ {x%。*}(如果我们知道扩展名,则使用basename" $ x" .ext")的解决方案要简单得多。