FreeBSD 上的 sed -i

sed -i on FreeBSD

我将字符串存储在两个变量中(行是当前行,新行是替换行)。我的代码如下所示:

sed -i "s@line@new@" output_file

但是,此解决方案不适用于 FreeBSD。

有什么方法可以稍微修改一下这段代码使其正常工作吗?

是的。使用:

sed -i '' "s@line@new@" output_file

在 BSD 系统(和 macOS 也是)上,sed 命令的 -i 选项需要一个后缀,它可以附加到 -i 或一个单独的参数。但是,当后缀为空时,它必须是一个单独的参数。这与 GNU sed 不同,其中 -i 选项采用可选后缀,但如果指定,则必须附加到 -i 选项。因此,在两者(BSD 和 GNU)之间可移植的脚本必须使用附加到 -i 选项的显式非空后缀编写。请注意,此类脚本可能仍然无法移植到其他 POSIX 系统; -i 选项未标准化(从不同的行为中可以看出)。