【问题标题】:How to shorten path parts between // in bash如何在bash中缩短//之间的路径部分
【发布时间】:2016-07-12 15:25:18
【问题描述】:

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

【问题讨论】:

  • 我觉得这肯定是错误的,因为这个parse_git_branch() { git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/' } 在这个提示中工作正常:export PS1="\[\033[32m\]\w\[\033[33m\]\$(parse_git_branch)\[\033[00m\] $ "
  • @lurker:但是,如果你设置PS1=\$(parse_git_branch),那么PS1每次都重新计算。
  • 你应该看看this的帖子。
  • @lurker 它正在每次都被评估,试试看。
  • @drewyupdrew 感谢您的链接,不幸的是 bash 功能似乎不起作用,我不想安装 ruby​​ 来运行它。

标签: bash sed prompt


【解决方案1】:

如果你想无条件地缩短所有路径组件,你可以很容易地使用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='\$ '
$

【讨论】:

  • 当您像这样通过管道传递它时,这可以工作:pwd | sed "s|^$HOME|~|" 2&gt; /dev/null | sed 's/\([^/]\)[^/]*\//\1\//g'。可以将其修改为缩​​短为一个字符并保留前导点吗?
  • ~/.config/anapp/settings -> ~/.c/a/settings
  • @RusinaRange:现在你正在改变球门柱:)
  • 我是 :P 在我尝试您的解决方案并转到配置文件夹之前没有意识到这是一个问题 :D 无论如何,将其标记为已解决,得到那个点会很高兴不过。
  • @RusinaRange:bash 替换更加健壮。我的双命令 sed 版本和你的管道没有区别,除了我的版本效率更高(只有一个 sed 进程)。
【解决方案2】:

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

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

PROMPT_COMMAND=shorten_path

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

【讨论】:

  • 是的;我可能把你的问题回答得太具体了。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 2020-10-08
    • 1970-01-01
    • 2011-03-30
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多