web-dev-qa-db-ja.com

'/'で区切られた文字列の開始部分と終了部分を選択するにはどうすればよいですか(私の場合はPS1プロンプト)

PS1プロンプト、特に/で区切られた$ PWD部分をカスタマイズしています。

いくつかの中で、私は現在のディレクトリを持つのが好きです。
ただし、ディレクトリが長すぎる場合は、開始...終了します

たとえば、代わりに

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

最初のディレクトリと最後の2つのディレクトリ、つまり.

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で{}、()、{}を使用してさまざまな部分文字列を試しましたが、形式を正しく取得できません。

更新-私はこれをまとめるためにguidosanswer(accepted)の情報を使用しました:

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\$ '

これにより、次のことが得られます。

enter image description here

悲しい量のコードが3つの白いコロンセパレーターに対して\033[00m\]:繰り返されます!

2
Michael Durrant

この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"`]\$ '

私自身は、最初の行の長いパスに十分なスペースを提供する複数行のプロンプトを好みます。

3
guido

あなたはそれを分割してあなたが望む部分を選ぶべきです:

( 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"`"
)"
1
mikeserv