我有一个带有 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 的最短和最长字符串的值。随着$var
pattern
M
参数扩展标志,它不是将其移除,而是扩展到所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 中使用不同的分隔符。选择截止变量中不存在的分隔符)