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

How to shorten path parts between // in bash

我希望缩短 bash 提示路径:

~/workspace/project/my-project
# Should be
~/w/p/my-project

这可以通过将 // 之间的部分路径字符串缩短为第一个字符来实现。

有没有办法在 sed 中做到这一点?

编辑:

认为其他人对此进行调查可能会发现我结束的有用,所以我在这里编辑它。

.bashrc:

dir_chomp () {
    pwd | sed "s|^$HOME|~|" 2> /dev/null | sed 's:\(\.\?[^/]\)[^/]*/:/:g'
}

parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ ()/'
}

export PS1="\[3[32m\]$(dir_chomp)\[3[33m\]$(parse_git_branch)\[3[00m\] $ "

提示示例(未显示颜色):

~/w/e/coolstuff (master) $
~/.c/A/Cache $

如果你想无条件地缩短所有路径组件,你可以很容易地做到 sed:

sed 's:\([^/]\)[^/]*/:/:g'

如果你还想在以 $HOME 开头的路径开头插入 ~,你可以将其添加到 sed 命令中(尽管这个天真的版本假设 $HOME不包括冒号)。

sed 's:^'"$HOME"':~:/;s:\([^/]\)[^/]*/:/:g'

更好的解决方案是使用 bash 替换:

short_pwd() {
  local pwd=$(pwd)
  pwd=${pwd/#$HOME/\~}
  sed 's:\([^/]\)[^/]*/:/:g' <<<"$pwd"
}

使用 bash 函数,您可以从 PS1 字符串中 "call" 它:

$ PS1='$(short_pwd)$ '
~/s/tmp$ PS1='$ '
$

每次显示时使用PROMPT_COMMAND动态设置您的提示。

shorten_path () {
    cwd=${PWD/workspace/w}
    cwd=${cwd/project/p}
    cwd=${cwd/$HOME/~}
    PS1="$cwd "'$ '
}

PROMPT_COMMAND=shorten_path

这将使用自定义代码替换 \w 转义以缩短当前工作目录。不幸的是,将 ~ 替换为您的主目录的名称会带来不幸的副作用,这就是为什么需要第三行才能将其放回原位的原因。

我用它来缩短到 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)) $"