Como posso selecionar uma parte inicial… final de uma string delimitada por '/' (prompt PS1 no meu caso)

2

Estou personalizando meu prompt do PS1, especificamente a parte $ PWD que é delimitada por / 's

entre várias coisas que gosto de ter o diretório atual.
No entanto, se o diretório é muito longo eu gostaria de ter início ... terminando

Por exemplo, em vez de

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

Eu gostaria de ter os primeiros diretórios e os dois últimos, ou seja,

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

Ele deve lidar quando eles se sobrepõem parcialmente, ou seja,

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

e quando eles são iguais, ou seja,

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

Eu tentei vários substrings se $ PWD usando {}, () e {}, mas não consigo obter o formato correto.

Atualização - usei as informações em guidos para responder (aceito):

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

que produz:

Uma quantidade triste do código é repetida 3[00m\]: para o separador de 3 pontos brancos!

    
por Michael Durrant 12.04.2014 / 14:18

2 respostas

3

Este comando sed executa um regex que deve ser útil para sua tarefa:

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

Teste:

PS1PWD_REGEX='s#\(/[^/]\+/[^/]\+/\).*\(/[^/]\+/[^/]\+\)/\?#...#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
~

Você pode então configurar seu perfil nas linhas:

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

Eu mesmo prefiro um prompt multilinha que dá muito espaço para caminhos longos na primeira linha.

    
por 12.04.2014 / 15:14
1

Você deve apenas dividi-lo e escolher as partes que deseja:

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

Para obter apenas o começo / fim:

start_end="$(IFS=/ ; set -- $string ; unset IFS
    printf '/%s/.../%s' "$1" \
        "'shift $(($#-1)) ; echo "$1"'"
)"
    
por 12.04.2014 / 19:35