我希望缩短我的bash提示路径:
~/workspace/project/my-project
# Should be
~/w/p/my-project
这可以通过简单地将//之间的路径字符串部分缩短为第一个字符来实现。
有没有办法在sed中执行此操作?
编辑:
以为有人在调查这个可能会发现我最终有用,所以我在这里编辑它。
.bashrc中:
dir_chomp () {
pwd | sed "s|^$HOME|~|" 2> /dev/null | sed 's:\(\.\?[^/]\)[^/]*/:\1/:g'
}
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
export PS1="\[\033[32m\]\$(dir_chomp)\[\033[33m\]\$(parse_git_branch)\[\033[00m\] $ "
提示示例(着色没有显示):
~/w/e/coolstuff (master) $
~/.c/A/Cache $
答案 0 :(得分:2)
如果您想无条件地缩短所有路径组件,可以使用sed
轻松完成:
sed 's:\([^/]\)[^/]*/:\1/:g'
如果您还要在以~
开头的路径的开头插入$HOME
,可以将其添加到sed命令(尽管这个天真的版本假设$HOME
没有包括冒号)。
sed 's:^'"$HOME"':~:/;s:\([^/]\)[^/]*/:\1/:g'
更好的解决方案是使用bash替换:
short_pwd() {
local pwd=$(pwd)
pwd=${pwd/#$HOME/\~}
sed 's:\([^/]\)[^/]*/:\1/:g' <<<"$pwd"
}
使用该bash函数,您可以从PS1字符串中“调用”它:
$ PS1='$(short_pwd)\$ '
~/s/tmp$ PS1='\$ '
$
答案 1 :(得分:1)
每次显示时都使用PROMPT_COMMAND
动态设置提示。
shorten_path () {
cwd=${PWD/workspace/w}
cwd=${cwd/project/p}
cwd=${cwd/$HOME/~}
PS1="$cwd "'\$ '
}
PROMPT_COMMAND=shorten_path
这取代了\w
转义符与自定义代码的使用,以缩短当前工作目录。但是,将~
替换为您的主目录名称会产生令人遗憾的副作用,这就是为什么如果需要,第三行必须将其放回原点。
答案 2 :(得分:0)
我用它来缩短3个角色,加上“ ..”:
shortpath()
{
dir=${1%/*} && last=${1##*/}
res=$(for i in ${dir//\// } ; do echo -n "${i:0:3}../" ; done)
echo "/$res$last"
}
缩写为一个角色的版本:
shortpath()
{
dir=${1%/*} && last=${1##*/}
res=$(for i in ${dir//\// } ; do echo -n "${i:0:1}/" ; done)
echo "/$res$last"
}
然后:
export PS1="\$(shortpath \$(pwd)) $"