我已经成功地使用下面的sed命令来搜索/替换Linux中的文本:

sed -i 's/old_link/new_link/g' *

然而,当我在Mac OS X上尝试它时,我得到:

“命令c期望\后面跟着文本”

我以为我的Mac运行一个正常的BASH shell。有什么事吗?

编辑:

根据@High Performance的说法,这是因为Mac sed是不同的(BSD)风格,因此我的问题是如何在BSD sed中复制这个命令?

编辑:

下面是一个实际的例子:

sed -i 's/hello/gbye/g' *

当前回答

下面是如何将环境变量应用到模板文件(不需要备份)。

1. 用{{FOO}}创建模板供以后替换。

echo "Hello {{FOO}}" > foo.conf.tmpl

2. 将{{FOO}}替换为FOO变量并输出到新的FOO .conf文件

FOO="world" && sed -e "s/{{FOO}}/$FOO/g" foo.conf.tmpl > foo.conf

支持macOS 10.12.4和Ubuntu 14.04.5

其他回答

sed -ie 's/old_link/new_link/g' *

可以在BSD和Linux上使用gnu sed

您的Mac确实运行BASH shell,但这更多的是您正在处理哪个sed实现的问题。在Mac上,sed来自BSD,与典型Linux机器上的sed略有不同。我建议你男子汉一点。

如果使用-i选项,则需要为备份提供扩展。

如果你有:

File1.txt
File2.cfg

命令(注意-i和"和-e之间缺少空格,以使其在新版本的Mac和GNU上工作):

sed -i'.original' -e 's/old_link/new_link/g' *

创建2个备份文件,例如:

File1.txt.original
File2.cfg.original

没有可移植的方法来避免备份文件,因为不可能找到适用于所有情况的sed命令的组合:

Sed -i -e…-不能在OS X上运行,因为它会创建-e备份 Sed -i " -e…不能在OS X 10.6上运行,但可以在10.9+上运行 Sed -i " -e…-不工作在GNU上

注意:假定没有一个sed命令可以在所有平台上运行,您可以尝试使用另一个命令来实现相同的结果。

例如:perl -i -pe's/old_link/new_link/g' *

这适用于GNU和BSD版本的sed:

sed -i'' -e 's/old_link/new_link/g' *

或者有备份:

sed -i'.bak' -e 's/old_link/new_link/g' *

注意-i选项后面缺少空格!(GNU sed必需)

我不使用sed调用sed,而是使用./bin/sed

这是我的~/project/bin/sed中的包装器脚本

#!/bin/bash

if [[ "$OSTYPE" == "darwin"* ]]; then
  exec "gsed" "$@"
else
  exec "sed" "$@"
fi

不要忘记chmod 755包装器脚本。