コマンド
pwd | sed "s@$HOME\(/.*\)\?\$@~\1@" | rev | perl -nle '@a=(m@[^/]+@g);if($#a<3){print;}else{print join("/",@a[0,1,2])."/..";}' | rev
解説
- カレントディレクトリを出力
- ホームディレクトリを「~」に置換
- 単純に置換すると、$HOME が「/home/fuga」の場合、「/home/fuga-piyo」とかも「~-piyo」になっちゃうので、「ホームディレクトリ文字列の後に、「/」のあとに任意の文字列が続くか、もしくは何も続かないかしたあとに行末」というパターンを指定している
- 出力を反転
- 「/」以外の文字列にマッチする部分を配列で取得(「/」で explode)
- 配列の要素数が3未満ならそのまま出力、それ以外なら、3つの要素だけ取り出して、「/」で結合、おしりに「/..」をくっつけて出力
- 出力を反転
実行結果
[~/hoge]$ pwd | sed "s@$HOME\(/.*\)\?\$@~\1@" | rev | perl -nle '@a=(m@[^/]+@g);if($#a<3){print;}else{print join("/",@a[0,1,2])."/..";}' | rev
~/hoge
[~/hoge/piyo/fuga]$ pwd | sed "s@$HOME\(/.*\)\?\$@~\1@" | rev | perl -nle '@a=(m@[^/]+@g);if($#a<3){print;}else{print join("/",@a[0,1,2])."/..";}' | rev
../hoge/piyo/fuga