pwd でカレントディレクトリから3階層上までを表示したい

コマンド

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

実行結果

[~/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