您可以尝试实现的一种方法是使用 Bash 的正则表达式(版本 3.2 及更高版本)。
f=/foo/bar/myfile.0076.jpg
pattern='/([^/]*)/[^/]*\.([0-9]*)\.'
[[ $f =~ $pattern ]]
echo ${BASH_REMATCH[1]} # bar
echo ${BASH_REMATCH[2]} # 0076
您可以按顺序应用大括号扩展运算符:
f=/foo/bar/myfile.0076.jpg
r=${f%.*} # remove the extension
r=${r#*.} # remove the part before the first (now only) dot
echo $r # 0076
r=${f%/*} # similar, but use slash instead of dot
r=${r##*/}
echo $r # bar
另一种方法是将大括号扩展与扩展 glob 结合起来:
shopt -s extglob
f=/foo/bar/myfile.0076.jpg
r=${f/%*([^0-9])} # remove the non-digits from the beginning
r=${r/#*([^0-9])} # remove the non-digits from the end
echo $r # 0076
r=${f/#*(\/*([^\/])\/)} # remove the first two slashes and what's between them
r=${r/%\/*(?)} # remove the last slash and everything after it
echo $r # bar
编辑:
这是我的 Bash 函数,它们执行basename
和dirname
. 它们以类似于那些实用程序的方式处理边缘情况。
bn ()
{
[[ $1 == / ]] && echo / || echo "${1##*/}"
}
dn ()
{
[[ -z ${1%/*} ]] && echo / || {
[[ $1 == .. ]] && echo . || echo "${1%/*}"
}
}