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

时间:2010-09-24 18:59:23

标签: regex bash sed

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

5 个答案:

答案 0 :(得分:17)

这应该适用于POSIX shell:

echo ${PWD%/*/*}

会给你一个绝对路径而不是相对路径。

另外,请参阅我的回答here,其中我提供了两个功能:

cdn () { pushd .; for ((i=1; i<=$1; i++)); do cd ..; done; pwd; }

n 作为参数的情况下上升 n 级别。

cdu () { cd "${PWD%/$1/*}/$1"; }

进入当前工作目录上方的命名子目录。

答案 1 :(得分:16)

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

parent=`dirname $PWD`
grandparent=`dirname $parent`

修改

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

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

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

parent=$(dirname $PWD)
grandparent=$(dirname $parent)

答案 2 :(得分:5)

为什么不使用

"${PWD}/../.."

答案 3 :(得分:0)

不是sed或正则表达式,但这确实做了任意父数量:

$ cd $(mktemp -dp $(mktemp -dp $(mktemp -dp $(mktemp -d)))) && \
> n=3 && \
> readlink -f  ${PWD}/$(for i in $(seq ${n}); do echo -n '../' ; done)
/tmp/tmp.epGcUeLV9q

在此示例中,我cd进入5深的临时目录,分配n=3,构建相对路径n${PWD}升级,{{1 -f, --canonicalize的结果。

答案 4 :(得分:0)

这是对我有用的正则表达式。 grep和Perl / sed之间有点不同:

扩展的正则表达式将路径分解为0或更多的sudo apt-get install p7zip-full组,这些组锚定到行的末尾,基本上向后工作/ABC123消耗了这场比赛之前的所有东西,并将其替换。

(.*)

Grep可以使用正向user@home:~/adir/bdir$ pwd /home/user/adir/bdir user@home:~/adir/bdir$ pwd | perl -pe 's|(.*)((/.*?){0})$|\1|' /home/user/adir/bdir user@home:~/adir/bdir$ pwd | perl -pe 's|(.*)((/.*?){1})$|\1|' /home/user/adir user@home:~/adir/bdir$ pwd | sed -r 's|(.*)((/.*?){2})$|\1|' /home/user user@home:~/adir/bdir$ pwd | sed -r 's|(.*)((/.*?){3})$|\1|' /home user@home:~/adir/bdir$ pwd | sed -r 's|(.*)((/.*?){4})$|\1|' 来模拟替换,它告诉grep匹配除模式之外的所有内容。 (?=告诉grep使用Perl正则表达式,仅显示匹配项。

-Po

当然,它对于Windows样式路径同样适用:

user@home:~/adir/bdir$ pwd
/home/user/adir/bdir

user@home:~/adir/bdir$ pwd | grep -Po '(.*)(?=((/.*?){0})$)'
/home/user/adir/bdir

user@home:~/adir/bdir$ pwd | grep -Po '(.*)(?=((/.*?){1})$)'
/home/user/adir

user@home:~/adir/bdir$ pwd | grep -Po '(.*)(?=((/.*?){2})$)'
/home/user

user@home:~/adir/bdir$ pwd | grep -Po '(.*)(?=((/.*?){3})$)'
/home

user@home:~/adir/bdir$ pwd | grep -Po '(.*)(?=((/.*?){4})$)'

对不起,您所做的编辑,但是我已经从事这个谜题研究了大约16个小时。只是不断尝试不同的排列并重新阅读正则表达式文档。它最终不得不陷入。