OSXとUbuntuの両方でsedコマンドを機能させるにはどうすればよいですか?

OSXとUbuntuの両方でsedコマンドを機能させるにはどうすればよいですか?

私はPS1プロンプトをカスタマイズし、現在のディレクトリを含めるのが好きです。

時間、ユーザー、gitブランチなどの他のプロジェクトがいくつかあります。

ここに画像の説明を入力してください。

しかし、問題の1つは、現在のディレクトリが/home/durrantmm/Dropnot/webs/rails_apps/linker/app/views多すぎるレベルの「深い」ケースです。 (しかし、とにかくPS1プロンプトの設定の終わりにEnterキーを押すと、実際の$が左に戻りましたが、ここでは問題になりません。)

だから解決策があります。位置部分にこれを使用してください。

LOCATION='\033[01;34m\]`pwd | sed "s#\(/[^/]\+/[^/]\+/[^/]\+/\).*\(/[^/]\+/[^/]\+\)/\?#\1_\2#g"`'

きれいではありませんが、操作を実行してから、他のもの(表示されていない、ここでは不要)と組み合わせて、ディレクトリの「最初の3つのレベル_最後の2つのレベル」を取得します。

ここに画像の説明を入力してください。

残念ながら、私のMacではsed部分は機能しませんが、次のようになります。

ここに画像の説明を入力してください。
[これは実際に私のLinuxコンピュータからのものです。気になるケースに備えて、私のMacでどのように見えるかを示すために偽にしました。

3_2Macで現在のディレクトリの形式を取得する方法は?

答え1

コマンドの部分と部分は\+GNU拡張です。 POSIX 互換性は、単に拡張正規表現のこの側面を使用することはできません。代わりにとを使用できます。この試み:\?sedsed\{1,\}\{0,1\}

LOCATION='\033[01;34m\]`pwd |
  sed "s#\(/[^/]\{1,\}/[^/]\{1,\}/[^/]\{1,\}/\).*\(/[^/]\{1,\}/[^/]\{1,\}\)/\{0,1\}#\1_\2#g"`'

これについて詳しくは、以下をご覧ください -http://pubs.opengroup.org/onlinepubs/009696699/utilities/sed.htmlそしてhttp://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap09.html

sedまたは、.OSXを使用してOSXで拡張正規表現を有効にすることもできます-E。これにより、次のことができます。

LOCATION='\033[01;34m\]`pwd |
  sed -E "s#\(/[^/]+/[^/]+/[^/]+/\).*\(/[^/]+/[^/]+\)/?#\1_\2#g"`'

ただし、これはGNU sed-r使用される)では機能しません。 POSIXソリューションを使用すると、より良い移植性が得られます。

関連情報