我正在使用PWD来获取当前的工作目录。是否有一个SED或正则表达式,我可以使用,比方说,让两个父母的完整路径?
答案 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`
修改强>
$()
优于反引号``
。我对他们没有经验。更多信息:
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个小时。只是不断尝试不同的排列并重新阅读正则表达式文档。它最终不得不陷入。