我已经成功地使用下面的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' *

当前回答

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

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

#!/bin/bash

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

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

其他回答

这适用于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必需)

我已经创建了一个函数来处理MacOS(在MacOS 10.12上测试)和其他操作系统之间的sed差异:

OS=`uname`
# $(replace_in_file pattern file)
function replace_in_file() {
    if [ "$OS" = 'Darwin' ]; then
        # for MacOS
        sed -i '' -e "$1" "$2"
    else
        # for Linux and Windows
        sed -i'' -e "$1" "$2"
    fi
}

用法:

$(replace_in_file 's,MASTER_HOST.*,MASTER_HOST='"$MASTER_IP"',' "./mysql/.env")

地点:

,是delimeter

的年代,MASTER_HOST。*,MASTER_HOST=' ' $MASTER_IP ','是模式

”。/ mysql /。Env "是文件的路径

在Mac中遇到了同样的问题,并使用brew解决了它:

brew install gnu-sed

使用as

gsed SED_COMMAND

你也可以将sed作为别名设置为gsed(如果你想):

alias sed=gsed

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

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

可以在BSD和Linux上使用gnu sed