2016-05-03 14 views
0

最後のディレクトリのフルネームだけが表示されるように、現在の作業ディレクトリを圧縮する最良の方法を知りたい。私は例を挙げてみましょう:私はそれを私が~/w/p/src純粋にbash正規表現を使用して作業ディレクトリを圧縮

を得ることができるようにbashの正規表現の交換操作を行うことができるようにしたい

$ echo $PWD 
/Users/mac/workshop/project1/src 

私はでリード〜を得るための最初の部分を取得することができます$ {PWD /の#$ HOMEを/ \〜}やっ

$ echo ${PWD/#$HOME/\~} 
~/workshop/project1/src 

私は正規表現、他にどのような操作を行うことができますすることは(それは正規表現演算子をチェーンすることは可能ですか?)私は

を次取得するようにこのため
$ echo ${PWD/#$HOME/\~} ... 
~/w/p/src 

私だけ行う必要があり注意がないのsed、awkは、グレップなど、つまりはbashを使用して

意思、私はすなわち

はbashに基づいてPROMPT値を設定することができるようですあなたが好きなように簡単

export PROMPT=${PWD/#$HOME/\~}... 
+1

:)ことを行う方法を知って、私は考えていませんあなたはそれを行うことができます、 'bash'には組み込みの正規表現置換操作がありません。 '$ {var/pattern/replacement}'を持っていますが、patternは正規表現ではなくワイルドカードなので、置換部分を置換部分にコピーする方法はありません。 – Barmar

+0

... "bash regex replacement"?え?パラメータの展開では正規表現ではなく、fnmatch形式の式を使用します。 –

答えて

3

だけのbashでDO-ことができますが、ない:私の.bashrcに、私がしたい

$ squashPWD() {  
    local pwd parts part 
    IFS=/ read -ra parts <<< "${PWD/#$HOME/\~}" 
    for part in "${parts[@]:0:${#parts[@]}-1}"; do 
     pwd+="${part:0:1}/" 
    done 
    echo "$pwd${parts[-1]}" 
} 

$ pwd 
/home/jackman/tmp/adir/foo 

$ squashPWD 
~/t/a/foo 

$ cd /usr/local/share/doc/fish/ 

$ squashPWD 
/u/l/s/d/fish 
あなたがbashの必要がない場合は

PS1='\[email protected]\h:$(squashPWD) \$ ' 
+0

私は 'set - $ pwd'の前にグロブの展開を止めることをお勧めします。あるいは、' local -a pieces; IFS = /読み取り-r -a個; set - "$ {pieces [@]}"(関数のどこかで '$ @ 'を使用したい場合は、最後のものはオプションです)、より安全に配列に分割することができます。 –

+0

チャールズ、ありがとう、ありがとう。 –

1

はそれがない必要することがない:

squashPWD() { perl -pe 's/^$ENV{HOME}/~/; s{([^/])[^/]*(?=/)}{$1}g' <<<"$PWD"; } 

いずれかの方法を、あなたのプロンプトは次のようにすることができすべてのbashでは、bashrcまたはbash_profileの関数を使用でき、sedまたはawkを使用できます。あなたのbashrcにこのような何かを置くことができます。

short() { 
    local short_path=$(echo "$PWD" | sed -E 's!/(.)[^/]*!/\1!g') 
    local last_dir=${PWD##*/} 
    echo "${short_path::-1}${last_dir}" # remove last character (1st character of last directory, and just append the last directory) 
} 

PS1='$(short) ' 

を覚えておいてください私は~であなたの$HOMEディレクトリを置き換えるとは思わないが、あなたは

+1

あなたは$ PATH変数を抹消しました。 ALL_CAPS_VARNAMESを使用しないでください –

+0

@glennjackman AH!ありがとう、それは長い一日だった。 – drewyupdrew

+1

また、変数 'local'を宣言しないと、それらはすべてグローバルなので、関数スコープではありません –