/
我正在自定义 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"`"
)"