/
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 $
$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"`"
)"