macOS Bash shell脚本中的目录截断和转换为字符串问题

macOS Bash shell脚本中的目录截断和转换为字符串问题,bash,macos,shell,Bash,Macos,Shell,在macOS BASH中,如何打印以下内容: thisPath="/Users/admin/Sites/codebase/projects/DrawingProject" modifiedPath="$($thisPath|rev|cut -d '/' -f-2|rev)" printf "[[[[[ $modifiedPath ]]]]]\n" 现在我得到一个目录错误 多谢各位-Jonathan一种方法是使用awk: [[[[[ projects/DrawingProject ]]]]

在macOS BASH中,如何打印以下内容:

thisPath="/Users/admin/Sites/codebase/projects/DrawingProject"
modifiedPath="$($thisPath|rev|cut -d '/' -f-2|rev)"

printf "[[[[[  $modifiedPath ]]]]]\n"
现在我得到一个目录错误


多谢各位-Jonathan

一种方法是使用
awk

[[[[[  projects/DrawingProject ]]]]]

这是一个很好的答案。下面是使用
basename
dirname

[[[[[  projects/DrawingProject ]]]]]

如果您的
bash
支持


为了理解这一点,考虑它的不同部分:

$ thisPath="/Users/admin/Sites/codebase/projects/DrawingProject"
$ echo "[[[[[  ${thisPath#${thisPath%/*/*}/} ]]]]]"
[[[[[  projects/DrawingProject ]]]]]
  • %
    用于从字符串末尾删除最小匹配项
  • /*/*
    因此这将删除
    /projects/DrawingProject
    中包含
    /
    后跟任何字符的
    /
    ,然后再后跟任何字符
类似地,
#
允许从字符串开头删除最小匹配项。例如:

$ echo "${thisPath%/*/*}"
/Users/admin/Sites/codebase
结合这两个概念:

$ echo "${thisPath#/*/}"
admin/Sites/codebase/projects/DrawingProject
  • ${thisPath%/*/*}
    将提供
    /Users/admin/Sites/codebase
  • 然后给出额外的
    /
  • 因此,实际上,
    /Users/admin/Sites/codebase/
    将被删除,我们将得到
    projects/DrawingProject

下面所有的好东西,我更喜欢,但是如果你改成
mPath=$(echo“$thisPat”| rev |······················。
$ echo "${thisPath%/*/*}"
/Users/admin/Sites/codebase
$ echo "${thisPath#/*/}"
admin/Sites/codebase/projects/DrawingProject
$ echo "${thisPath#${thisPath%/*/*}/}"
projects/DrawingProject