如何在bash脚本中获得类似vim选项卡的短路径?

如何在bash脚本中获得类似vim选项卡的短路径?,bash,Bash,我想创建一个bash提示符,其中包含指向当前工作目录的缩短路径,因此 ~/folder/directory/foo 将成为 ~/f/d/foo 我是从这里描述的一个定制的bash提示符()中得到这个想法的,它包含了本应该这样做的代码(根据注释),但是没有。我对bash脚本一无所知,但我打赌这是一个很容易回答的问题 bash脚本中的哪一行或几行代码可以让我生成工作目录的缩短版本?您可以通过sed命令更改$PWD变量(包含当前目录的字符串),如下所示: echo$PWD | sed's://\(

我想创建一个
bash
提示符,其中包含指向当前工作目录的缩短路径,因此

~/folder/directory/foo
将成为

~/f/d/foo
我是从这里描述的一个定制的
bash
提示符()中得到这个想法的,它包含了本应该这样做的代码(根据注释),但是没有。我对
bash
脚本一无所知,但我打赌这是一个很容易回答的问题


bash脚本中的哪一行或几行代码可以让我生成工作目录的缩短版本?

您可以通过
sed
命令更改
$PWD
变量(包含当前目录的字符串),如下所示:

echo$PWD | sed's://\(.\)[^/]*/://\1/:g'

基本上,这个sed查找两个
/
之间的一切(
g
)(这就是为什么我使用
作为分隔符),并将其替换为第一个字符(由
\(
\)
包围的
,后面被引用为
\1
),再次被
//code>包围

如果将其设置为
PS1
变量,则可以根据请求更改bash提示符


希望对您有所帮助。

您可以通过
sed
命令更改
$PWD
变量(包含当前目录的字符串),如下所示:

echo$PWD | sed's://\(.\)[^/]*/://\1/:g'

基本上,这个sed查找两个
/
之间的一切(
g
)(这就是为什么我使用
作为分隔符),并将其替换为第一个字符(由
\(
\)
包围的
,后面被引用为
\1
),再次被
//code>包围

如果将其设置为
PS1
变量,则可以根据请求更改bash提示符


希望对您有所帮助。

使用
sed
是最简单的,因为它支持regex backreference,但为了乐趣和利润,纯
bash
解决方案:

path="$(while read -rd/; do echo -n ${REPLY::1}/; done <<< "$PWD"; echo "${PWD##*/}")"

path=“$(while read-rd/;do echo-n${REPLY::1}/;done使用
sed
是最简单的,因为它支持正则表达式反向引用,但是为了好玩和赚钱,纯
bash
解决方案:

path="$(while read -rd/; do echo -n ${REPLY::1}/; done <<< "$PWD"; echo "${PWD##*/}")"

path=“$(read-rd/;do echo-n${REPLY::1}/;done结合我在问题中引用的链接上的信息,结合Fernando的答案和我自己对regex的一些研究,这是提供我想要的路径的代码:

pwd | sed -e "s:$HOME:~:" -e "s:\(.\)[^/]*/:\1/:g"
第一个
sed
模式用
~
替换我的主目录
/home/joe
,第二个模式用第一个字符替换每个多字符目录名


如果有人感兴趣,我的bashprompt的完整代码如下:。您帮助我的部分在第39行。

结合我在问题中引用的链接上的信息,结合Fernando的答案和我自己对regex的一些研究,这是提供我想要的路径的代码:

pwd | sed -e "s:$HOME:~:" -e "s:\(.\)[^/]*/:\1/:g"
第一个
sed
模式用
~
替换我的主目录
/home/joe
,第二个模式用第一个字符替换每个多字符目录名


如果有人感兴趣,我的bashprompt的完整代码在这里:。您帮助我的部分在第39行。

这让我有了一部分,但不太管用。如果我的$PWD是/home/joe/Dropbox/foo/bar/folder,我希望是/h/j/D/f/b/folder,但我得到的只是/h/folder。好的,算了。这对
sed
co有效mmand:
sed“s:\(.\)[^/]*/:\1/:g”
。您的代码使用贪婪的正则表达式,将整个路径作为“两个
/
之间的某个对象”.Mine现在匹配任何一组不是斜杠的字符,再加上一个斜杠,所以它不会抓住整个路径。这让我有了一点想法,但不太管用。如果我的$PWD是/home/joe/Dropbox/foo/bar/folder,我希望是/h/j/D/f/b/folder,但我得到的只是/h/folder。好的,我想出来了。这适用于
sed
命令:
sed“s:\(.\)[^/]*/:\1/:g”
。您的代码使用贪婪的正则表达式,将整个路径作为“两个
/
之间的某个对象”.Mine现在匹配任何一组不是斜杠的字符,再加上一个斜杠,这样它就不会抓住整个路径。这就是诀窍。但是,我如何将上面的内容输入到变量中?正如在我引用的链接中一样,我想创建一个名为
path
的变量来保存此输出,然后用其他s插入我的bash提示符中tuff。这就是关键。但是,我如何将上面的内容输入变量?正如我引用的链接中一样,我想创建一个名为
path
的变量来保存此输出,然后将其他内容插入到bash提示符中。