如何在bash中缩短//之间的路径部分

时间:2016-07-12 15:25:18

标签: bash sed prompt

我希望缩短我的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 $

3 个答案:

答案 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)) $"