如何修复SED就地替换Mac OS和Ubuntu问题

时间:2012-05-30 07:03:25

标签: linux macos bash ubuntu

我有一个Bash脚本替换PHP常量,例如define('xxxx',....);与期望的一个。

由:

sudo sed -E -i "" "s/^(define).*(${2})[\'|\"].*/${3}/g" "$file"

问题是在Ubuntu上由于 i 之后的额外空间而失败。

-i ""

如果删除该空格,它将在Ubuntu上运行但不适用于MacOS,例如给出错误。

sed: 1: "../config.php ...": invalid command code

我可以选择在* nix上安静地使用此命令吗?

提前感谢您的时间和知识。

4 个答案:

答案 0 :(得分:2)

sudo perl -pi -e "s/^(define).*(${2})[\'|\"].*/${3}/g" "$file"

我怀疑你的意思是['\"]

答案 1 :(得分:1)

sed的

-i选项是GNU方言的一部分。这不便携。

另一种方法是使用临时中间文件:

sed ... ${file} > ${file}.tmp && mv ${file}.tmp ${file}

另一个是使用perl而不是sed,as suggested by triplee

答案 2 :(得分:1)

为了就地执行操作并抑制或避免创建备份文件,您可以在操作系统上设置数组条件。

[[ $(uname -s) == 'Darwin' ]] && ioption=(-i "") || ioption=(-i)
sed "${ioption[@]}" "s/^(define).*(${2})['\"].*/${3}/g" "$file"

使用数组,以便引用的参数和多个选项/参数都可以工作。如果您想要使其他条件有条件,您可以向数组中添加更多内容。

请注意,管道不是括号表达式中的替换字符 - 而是字面上包含它。因此,除非您想要匹配管道,否则应该省略它。在外部双引号内,单引号不需要转义。

答案 3 :(得分:0)

在OS X上安装GNU sed并使用它。