如何在Mac OS 10.10+上使用GNU sed,'brew install --default-names'不再支持

114
在 Mac OS 10.10.3 上,我通过输入以下命令安装了 gnu-sed:

在 Mac OS 10.10.3 上,我输入以下命令安装了 gnu-sed:

brew install gnu-sed --default-names

当我再次输入时,我收到以下消息:

gnu-sed-4.2.2 已经安装

然而,即使重启系统并重新启动终端,我仍然无法使用GNU版本的sed。例如:

echo a | sed ’s_A_X_i’

返回值:在替换命令“i”中存在错误标志。

为了让GNU版本工作,我应该做什么? 这是我$PATH变量中的路径。

/Users/WN/-myUnix
/opt/local/bin
/opt/local/sbin
/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin
/Applications/calibre.app/Contents/MacOS
/opt/ImageMagick/bin
/usr/texbin 

很抱歉如果我的问题看起来很明显,但我正在自学Shell脚本编程,还不太了解UNIX程序的安装方式。希望能得到帮助,以便在我的Mac上使用GNU兼容命令(在这种情况下是sed,但我很快也会需要其他命令),而不会造成损害或不必要的混乱。


2
brew 安装了 GNU sed 在哪个目录?这个目录在你的 PATH 上吗?如果输入 sed --version,你会得到什么结果?(BSD sed 会报错;GNU sed 会报告其版本信息。)除非你将 brew 目录放在 /usr/bin 前面或者学会使用 GNU sed 的绝对路径名,否则你将无法运行 GNU sed。引号也要小心。 是一个文字处理引号,不同于 ' - Jonathan Leffler
11个回答

124

注意(2019年):

--with-default-names 选项自2019年1月起已移除,因此该选项不再可用。

在安装时,Homebrew会指导如何调整路径,以便在不使用 g 前缀的情况下使用 sed。


您已经安装了gnu-sed,但没有使用--with-default-names选项。
  • 使用--with-default-names选项将sed安装到/usr/local/bin/
  • 如果不使用该选项,则安装gsed

因此,在您的情况下,您需要执行以下操作:

$ brew uninstall gnu-sed
$ brew install gnu-sed --with-default-names

如有需要,请更新路径...

$ echo $PATH | grep -q '/usr/local/bin'; [ $? -ne 0 ] && export PATH=/usr/local/bin:$PATH
$ echo a | sed 's_A_X_i'

或者像其他人建议的那样使用gsed

14
不再支持--with-default-names选项。 - Amol
1
一旦不再支持--with-default-names选项,您可以通过brew install gnu-sed正常安装它,然后通过brew info gnu-sed获取其路径。 - Lucas

65

如果您使用以下方式在 Mac OS X 上安装 GNU 版本的 sed

$ brew install gnu-sed

你使用的程序是gsed

所以举个例子:

$ echo "Calimero is a little chicken" > test
$ cat test
Calimero is a little chicken
$ gsed -i "s/little/big/g" test
$ cat test
Calimero is a big chicken

此外,为了补充在Mac OS X上使用GNU命令工具,这里有一篇不错的博客文章可以从linux获取这些工具:

在Mac OS X上安装和使用GNU命令行工具


27

$ brew install gnu-sed

$ export PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"

使用这两个命令,gnu-sed 可以正常工作


2
请记住,这仅适用于当前终端会话。 - Mahesh Jamdade

21

OS X自带的sed位于/usr/bin目录下。

homebrew安装的sed位于/usr/local/bin目录下。

如果您想使用homebrew版本的sed,有两个选项:

选项1

每次想要使用homebrewsed时,输入以下命令:

/usr/local/bin/sed

或者,更好的选择是

选项 2

在您的登录配置文件中将/usr/local/bin/移动到/usr/bin之前,像这样:

 export PATH=/usr/local/bin:<other places>

9
如果您需要使用gnu-sed命令的正常名称,可以在bashrc中添加一个"gnubin"目录到您的PATH中。只需在您的bash或终端中使用以下命令即可。
export PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"

2

--with-default-names 对我在 Mac OS X 10.14.2 上无效,因此我在 $PATH 更高的位置创建了一个名为 sed 的符号链接指向 gsed

我还在 $MANPATH 更高的位置创建了一个名为 sed.1 的符号链接指向 gsed.1 手册页,以便 man 访问 gsed 手册页而不是默认的 sed 手册页


5
你也可以使用别名,例如 alias sed=gsed - kenorb

1
这个导出的路径 PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH" 只在当前终端会话中有效,一旦你重新启动它就会消失(在 Mojave 中)。

2
如果您将其添加到.bashrc(如果您使用bash作为您的shell)或.zshrc(如果您使用zsh作为您的shell),它将在每次登录时执行。Apple曾经默认使用bash作为shell,但在Catalina中将默认shell切换为zsh。您可以通过在终端窗口中运行w来查看您的帐户设置使用哪个 - 您将获得一堆行,其中一些(在我的情况下,我使用zsh)看起来像jpb s000- Sun20 1day -zsh - -zsh显示我的帐户正在使用zsh - Joe Block
欢迎来到StackOverflow。请注意,这不是一个论坛,像这样的答案通常会被投票降低分数。(如果您收到了一个被投票降低的答案,您可以将其删除;这就是恢复您的分数所需的全部操作。)相反,我们通常寻找包括直接解决OP问题的答案以及您如何达到这个目标的答案。有关更多信息,请参见如何回答 - Chaim Eliyah

0
一个稍微更快的做法是按照@pjz的建议进行以下操作:
for p in $(ls -d ${HOMEBREW_PREFIX:-/usr/local}/Cellar/*/*/libexec/gnubin); do
    export PATH="${p}:${PATH}"
done

当然,这假定在中的每个GNU包都始终具有相同的目录层次结构,以便到达gnubin

或者,您可以通过在-type d之前添加-maxdepth 4标志来加速find,以减少其进入目录的距离。


0

由于 --with-default-names 选项在2019年1月被移除,我的hack解决方案是:

# hack to override mac tools with homebrew versions (ls, sed, etc)
for p in `find "${HOMEBREW_PREFIX}" -type d -name gnubin` ; do
    export PATH="${p}:${PATH}"
done

这个程序有点慢(每次登录都要爬取目录),但是它可以在不强制修改我的.bashrc的情况下,与使用brew安装的每个gnu工具一起正常工作。


0
在最新版本的Homebrew上运行brew install gnu-sed时,它在结尾处报告:
==> Caveats
GNU "sed" has been installed as "gsed".
If you need to use it as "sed", you can add a "gnubin" directory
to your PATH from your bashrc like:

    PATH="/opt/homebrew/opt/gnu-sed/libexec/gnubin:$PATH"

gnu-sed 默认安装为 gsed。但是,如果您查看 /opt/homebrew/opt/gnu-sed/libexec/gnubi,您会找到一个名为 sed 的命令。因此,按照上述说明更新路径应该意味着 sed 运行 gnu-sed


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接