web-dev-qa-db-ja.com

sedコマンドをOSXとUbuntuで動作させるにはどうすればよいですか?

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

時間、ユーザー、gitブランチなど、他にもいくつかの項目があります。

enter image description here

ただし、1つの問題は、現在のディレクトリが/home/durrantmm/Dropnot/webs/Rails_apps/linker/app/viewsのように「深い」レイヤーである場合、テキストが多すぎることです。 (ところで、PS1プロンプト設定内の最後にキャリッジリターンがあるので、実際の$は左側に戻ります。これは、ここでは問題ではありません)。

だから私はそれに対する解決策を持っています、これをロケーション部分に使用するために:

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

きれいではありませんが、それは仕事をし、それを他のものと組み合わせて(図には示されていません、ここでは必要ありません)、ディレクトリの「最初の3レベル_最後の2レベル」を取得します。

enter image description here

残念ながら、私のMacではsed部分が正しく機能しておらず、次のようになります。

enter image description here
[これは実際には私のLinuxマシンからのものです。不思議に思うかもしれませんが、Macでどのように表示されるかを示すために偽造しました)。

Macの現在のディレクトリの3_2形式を取得するにはどうすればよいですか?

2
Michael Durrant

sedコマンドの\+および\?の部分はGNU拡張機能-POSIX互換のsedは拡張正規表現のこれらの側面を使用できません代わりに、\{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

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

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

ただし、これはGNU sedでは機能しません(これには-rを使用します)。POSIXソリューションを使用すると、移植性が向上します。

4
Graeme