0

我有一个 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

4 回答 4

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

不过,我怀疑你的意思是真的['\"]

于 2012-05-30T07:15:35.460 回答
1

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

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

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

另一种方法是使用 perl 而不是 sed,正如 Triplee 所建议的那样

于 2012-05-30T07:20:06.533 回答
1

为了就地执行操作并禁止或避免创建备份文件,您可以根据操作系统设置一个数组条件。

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

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

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

于 2012-05-31T01:36:19.733 回答
0

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

于 2012-05-30T07:04:26.100 回答