如何使我的 sed 命令在 OSX 和 Ubuntu 上都能工作

如何使我的 sed 命令在 OSX 和 Ubuntu 上都能工作

我喜欢自定义 PS1 提示符并包括当前目录。

我还有其他几个项目,例如时间、用户、git 分支等,即

在此输入图像描述

然而,一个问题是,当我当前的目录有很多层“深”时,例如/home/durrantmm/Dropnot/webs/rails_apps/linker/app/views文本太多。 (顺便说一句,无论如何,我在 PS1 提示设置的末尾回车,所以我的实际 $ 回到了左侧,这不是这里的问题)。

所以我有一个解决方案,将其用于位置部分:

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

不漂亮,但它完成了工作,然后我将它与其他东西结合起来(未显示,此处不需要),我得到目录的“前 3 个级别 _ 最后两个级别”,即

在此输入图像描述

不幸的是,虽然在我的 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.htmlhttp://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 解决方案将提供更好的可移植性。

相关内容