我已经成功地使用下面的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' *
如果使用-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' *
正如其他答案所表明的那样,如果不创建备份文件,就无法在OS X和Linux之间可移植地使用sed。所以,我转而使用Ruby的一行代码来实现:
ruby -pi -e "sub(/ $/, '')" ./config/locales/*.yml
在我的例子中,我需要从rake任务中调用它(即在Ruby脚本中),所以我使用了以下附加级别的引用:
sh %q{ruby -pi -e "sub(/ $/, '')" ./config/locales/*.yml}
下面是如何将环境变量应用到模板文件(不需要备份)。
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
我已经创建了一个函数来处理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 "是文件的路径