Linux 如何修复替换Mac OS和Ubuntu的SED问题

Linux 如何修复替换Mac OS和Ubuntu的SED问题,linux,macos,bash,ubuntu,Linux,Macos,Bash,Ubuntu,我有一个替换PHP常量的Bash脚本,例如define('xxxx',…)与所需的一个 作者: 问题是,在Ubuntu上,由于i之后的额外空间,它失败了 -i "" 如果我删除该空间,它将在Ubuntu上工作,但在MacOS上不工作,例如,给出一个错误 sed: 1: "../config.php ...": invalid command code 我有什么办法可以在*nix上和平地使用这个命令 提前感谢您的时间和知识。在OS X上安装GNU并使用它。在OS X上安装GNU并使用它 sud

我有一个替换PHP常量的Bash脚本,例如
define('xxxx',…)与所需的一个

作者:

问题是,在Ubuntu上,由于i之后的额外空间,它失败了

-i ""
如果我删除该空间,它将在Ubuntu上工作,但在MacOS上不工作,例如,给出一个错误

sed: 1: "../config.php ...": invalid command code
我有什么办法可以在*nix上和平地使用这个命令


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

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

在OS X上安装GNU并使用它

sudo perl -pi -e "s/^(define).*(${2})[\'|\"].*/${3}/g" "$file"
不过,我怀疑你的意思是
['\“]


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

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

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

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

另一种方法是使用perl而不是sed,sed的-i选项是GNU方言的一部分。这不是便携式的

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

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

另一种方法是使用perl而不是sed。

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

[[ $(uname -s) == 'Darwin' ]] && ioption=(-i "") || ioption=(-i)
sed "${ioption[@]}" "s/^(define).*(${2})['\"].*/${3}/g" "$file"
使用数组可以使引用的参数和多个选项/参数都起作用。如果要使附加的内容有条件,可以向数组中添加更多内容


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

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

[[ $(uname -s) == 'Darwin' ]] && ioption=(-i "") || ioption=(-i)
sed "${ioption[@]}" "s/^(define).*(${2})['\"].*/${3}/g" "$file"
使用数组可以使引用的参数和多个选项/参数都起作用。如果要使附加的内容有条件,可以向数组中添加更多内容


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

请建议一种解决方案,而无需额外麻烦。其他一些命令等将跨域工作,感谢他们并不缺乏解决方案。每一个都有它自己的麻烦。请建议一个没有额外麻烦的解决方案。其他一些命令等将跨域工作,感谢他们并不缺乏解决方案。每个都有它自己的麻烦。让我测试一下,它看起来很直接让我测试一下,它看起来很直接谢谢大家的快速响应:)谢谢大家的快速响应:)OSX
sed
支持
-i
,但在备份扩展方面的方式略有不同。OS X
sed
支持
-i
,但在备份扩展方面的方式略有不同。谢谢@Dennis Williamson,这似乎是另一种方式。然而,tripleee的解决方案似乎是直截了当的。谢谢@Dennis Williamson,这似乎是另一种方式。然而,tripleee的解决方案似乎是直截了当的。