bash脚本正则表达式将目录路径提升到第n级

Ste*_*eve 15 regex bash sed

我正在使用PWD来获取当前的工作目录.是否有一个SED或正则表达式,我可以使用,比方说,让两个父母的完整路径?

Pau*_*ce. 18

这应该在POSIX shell中有效:

echo ${PWD%/*/*}
Run Code Online (Sandbox Code Playgroud)

这将给你一个绝对的路径,而不是一个相对的路径.

另外,请参阅我这里给出两个函数的答案:

cdn () { pushd .; for ((i=1; i<=$1; i++)); do cd ..; done; pwd; }
Run Code Online (Sandbox Code Playgroud)

其中上升ñ水平给出ň作为参数.

和:

cdu () { cd "${PWD%/$1/*}/$1"; }
Run Code Online (Sandbox Code Playgroud)

它上升到当前工作目录上方的命名子目录.

  • 这应该是答案.这比可接受的答案更可重用. (2认同)

Ber*_*t F 17

为什么sed或正则表达式?为什么不dirname:

parent=`dirname $PWD`
grandparent=`dirname $parent`
Run Code Online (Sandbox Code Playgroud)

编辑:

@Daentyh在评论中指出,在POSIX兼容的shell 中显然$()优先于反引号``进行命令替换.我对他们没有经验.更多信息:

http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_06_03

所以,如果这适用于你的shell,你可以(应该?)使用:

parent=$(dirname $PWD)
grandparent=$(dirname $parent)
Run Code Online (Sandbox Code Playgroud)

  • 你应该使用`$()`而不是`\`\``,因为他指定了bash. (3认同)
  • 即便如此,`$()`仍然是POSIX sh.(虽然不是所有的都是POSIX) (2认同)
  • 进一步说:你应该引用PWD作为"$ PWD"`,否则目录名中的空格会打破你.@ Benoit的解决方案虽然简单得多,但可以毫无困难地在任何地方使用.`dirname`也不完全便携. (2认同)

Ben*_*oit 5

为什么不用

"${PWD}/../.."
Run Code Online (Sandbox Code Playgroud)