如何选择“/”分隔字符串的开始...结束部分(在我的情况下为 PS1 提示)

如何选择“/”分隔字符串的开始...结束部分(在我的情况下为 PS1 提示)

/我正在自定义 PS1 提示符,特别是由'分隔的 $PWD 部分

其中我喜欢拥有当前目录。
但是,如果目录太长,我想开始...结束

例如,代替

otherstuff:~/apps/webs/2014/area1/groupa/current:other_stuff $ 

我想要第一个目录和最后两个目录,即

otherstuff:~/apps/webs/.../groups/current:other_stuff $ 

它应该处理它们部分重叠的情况,即

   otherstuff:~/apps/webs/2014:other_stuff $ 
-> otherstuff:~/apps/webs/2014:other_stuff $ 

当它们相同时,即

   otherstuff:~/apps/webs/:other_stuff $ 
-> otherstuff:~/apps/webs/:other_stuff $ 

我尝试了各种子字符串 if $PWD 使用 {}、() 和 {},但无法获得正确的格式。

更新 - 我使用 guidos 答案(已接受)中的信息将其放在一起:

parse_git_branch () {
  git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
}
PS1='\033[01;31m\]\t\033[00m\]:'
PS1=$PS1'\[\033[01;32m\]\u\033[00m\]:\033[01;34m\]'
PS1=$PS1'`pwd | sed "s#\(/[^/]\+/[^/]\+/\).*\(/[^/]\+/[^/]\+\)/\?#\1...\2#g"`'
PS1=$PS1'\033[00m\]:\033[01;33m\]$(parse_git_branch)\[\033[00m\]\n\$ '

产生:

在此输入图像描述

\033[00m\]:令人遗憾的是,对于 3 个白色冒号分隔符,重复了大量代码!

答案1

此 sed 命令运行一个对您的任务有帮助的正则表达式:

 sed 's#\(/[^/]\+/[^/]\+/\).*\(/[^/]\+/[^/]\+\)/\?#\1...\2#g'

测试:

PS1PWD_REGEX='s#\(/[^/]\+/[^/]\+/\).*\(/[^/]\+/[^/]\+\)/\?#\1...\2#g'
$ echo "~/apps/webs/2014/" | sed $PS1PWD_REGEX 
~/apps/webs/2014/
$ echo "~/apps/webs/chip/mips/2014/" | sed $PS1PWD_REGEX 
~/apps/webs/.../mips/2014
$ echo "~/apps/webs/chip/mips/2014" | sed $PS1PWD_REGEX 
~/apps/webs/.../mips/2014
$ echo "/apps/webs/chip/mips/clips/2014" | sed $PS1PWD_REGEX 
/apps/webs/.../clips/2014
$ echo "/" | sed $PS1PWD_REGEX 
/
$ echo "~" | sed $PS1PWD_REGEX
~

然后,您可以在以下行中设置您的个人资料:

export PS1='[\u@\h `pwd | sed "s#\(/[^/]\+/[^/]\+/\).*\(/[^/]\+/[^/]\+\)/\?#\1...\2#g"`]\$ '

我本人更喜欢多行提示,它为第一行的长路径提供了足够的空间。

答案2

您应该将其拆分并选择您想要的部分:

( IFS=/ ; set -- $string 
  while ${1+:} false ; do 
    echo "$1" ; shift
  done
)

仅获取开始/结束:

start_end="$(IFS=/ ; set -- $string ; unset IFS
    printf '/%s/.../%s' "$1" \
        "`shift $(($#-1)) ; echo "$1"`"
)"

相关内容