如何在shell脚本中提取路径的某些部分?

如何在shell脚本中提取路径的某些部分?

我有一个带有 path 的变量/usr/apps/app1/home/usera/run/10/_tmp/folder1/folder1。如何/usr/apps/app1/home/usera/run/10/_tmp在shell脚本中提取?

答案1

使用外壳参数扩展:

dir=/usr/apps/app1/home/usera/run/10/_tmp/folder1/folder1
echo "${dir%/*/*}"

/usr/apps/app1/home/usera/run/10/_tmp

参数扩展扩展参数:$foo, $1.您可以使用它来执行字符串或数组操作:"${file%.mp3}", "${0##*/}", "${files[@]: -4}"。他们应该总是被引用。

看:http://mywiki.wooledge.org/BashFAQ/073
LESS='+/Parameter Expansion' man bash
另请参阅http://wiki.bash-hackers.org/syntax/pe

答案2

在 zsh shell 中,对于:

dir=/usr/apps/app1/home/usera/run/10/_tmp/folder1/folder1

newdir=/usr/apps/app1/home/usera/run/10/_tmp

如果是从末尾删除 2 个路径组件:

newdir=$dir:h:h

与 csh 中相同,它使用历史记录获取路径的h开头部分h:h修饰语这里应用于参数扩展。

如果是获取路径的前 9 个组成部分:

newdir=${dir:h9}

如果是将所有内容都添加到最左侧出现的位置/_tmp

newdir=${(M)dir#*/_tmp}

对于最右边的出现:

newdir=${(M)dir##*/_tmp}

${var#pattern}和是来自 Korn shell 的运算符,用于在开始匹配时分别${var##pattern}扩展为 stripped 的最短和最长字符串的值。随着$varpatternM 参数扩展标志,它不是将其移除,而是扩展到所M附加的部分。


1 行为csh与zsh 给出的结果相同,而 csh 将那些尾随的dir=/usr/apps/app1/home/usera/run/10/_tmp/folder1/folder1/s视为附加路径组件,就像ksh 的 一样。dir=/usr/apps/app1/home/usera/run/10/_tmp/folder1/folder1///${dir%/*/*}

答案3

使用dirname

dir=/usr/apps/app1/home/usera/run/10/_tmp/folder1/folder1
dirname -- "$(dirname -- "$dir")"

/usr/apps/app1/home/usera/run/10/_tmp

答案4

假设您的路径变量中没有换行符 (\n),则可以使用 sed 完成此操作:

$ A=/usr/apps/app1/home/usera/run/10/_tmp/folder1/folder1
$ cutoff=/folder1/folder
$ echo "$A" | sed "s#$cutoff##"
/usr/apps/app1/home/usera/run/10/_tmp1

(由于您的字符串包含正斜杠,因此您需要在 sed 中使用不同的分隔符。选择截止变量中不存在的分隔符)

相关内容