【问题标题】:Bash shell / Command: strip out arbitrary components in a given path?Bash shell / 命令:去除给定路径中的任意组件?
【发布时间】:2013-12-06 06:50:21
【问题描述】:

如果我有,请说:

MYPATH=../Library/NetworkUtil/Classes/Headers/network.h

那我想再构造一条路径AllHeaders/NetworkUtil/network.h

我实际上需要从原始路径中取出不同的组件,有没有办法做到这一点?

我发现于:

Bash: remove first directory component from variable (path of file)

我也可以

${MYPATH#../Library}

去除指定部分,但假设我已经知道结构,如果在我的情况下我需要原始路径中的第三个和最后一个组件怎么办?

谢谢

【问题讨论】:

标签: bash shell command-line bsd


【解决方案1】:

您可以使用 bash 数组来访问单个元素:

$ MYPATH=../Library/NetworkUtil/Classes/Headers/network.h
$ OLD="$IFS"
$ IFS='/' a=($MYPATH)
$ IFS="$OLD"
$ NEWPATH="AllHeaders/${a[2]}/${a[-1]}"
$ echo $NEWPATH
AllHeaders/NetworkUtil/network.h

附录:为了完整起见,将 MYPATH 变成数组的另一种方法是使用 bash 的模式替换:a=(${MYPATH//\// }):

$ MYPATH=../Library/NetworkUtil/Classes/Headers/network.h
$ a=(${MYPATH//\// })
$ NEWPATH="AllHeaders/${a[2]}/${a[-1]}"
$ echo $NEWPATH
AllHeaders/NetworkUtil/network.h

这消除了与 IFS 混淆的需要,但如果 MYPATH 开头有空格、制表符或 CR,会严重破坏

【讨论】:

  • 但我需要任意组件,在我的情况下我需要最后一个,它可能并不总是第 5 个,所以 a[5] 不起作用。
  • @hzxu,没问题。数组的最后一个元素编号为“-1”。答案现已更新。
  • 更好的方法是使用IFS=/ read -a a <<< "$MYPATH"。它将对IFS 的更改限制为read 命令,并安全地处理包含空格的路径组件。
  • 对于仍在使用旧版本 bash 的人来说也是一个提示:您可能需要使用 ${a[${#a[@]}-1]} 而不是 ${a[-1]},因为最近引入了负下标。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
  • 1970-01-01
  • 2020-02-02
  • 1970-01-01
  • 2016-07-25
  • 2015-01-08
相关资源
最近更新 更多