带有-i选项的sed命令在Linux上执行成功,但在MacOS上失败

在linux系统上使用sed命令进行文本替换时,我已经成功地使用了以下命令:

sed -i 's/old_string/new_string/g' /path/to/file

然而,当我在Mac OS X上尝试使用相同的命令时,我遇到了以下错误:

command i expects \ followed by text

我以为我的Mac运行的是一个标准的BASH shell。问题出在哪里?

在Linux系统上,使用man sed命令查看手册,简介说明sed是一个用于过滤和转换文本的流编辑器。翻到对-i选项的描述部分,会发现该选项用于就地编辑文件(如果提供了后缀,则进行备份)。这意味着参数后缀SUFFIX是可选的,即带或不带这个参数都可以执行。

在MacOS系统上,使用man sed命令查看手册,简介说明sed是一个流编辑器。翻到对-i选项的描述部分,会发现-i选项的工作方式类似于-I,但它会将每个文件与其他文件独立处理。特别是,每个文件中的行号从1开始,“$”地址与当前文件的最后一行匹配,并且地址范围仅限于当前文件。最终结果是,每个文件都由一个单独的sed实例编辑。重要的是,-i后面需要一个必选参数extension,如果不写上扩展名参数就会报错,因此命令执行失败。

带有-i选项的sed命令在Linux上执行成功,但在MacOS上失败

腾讯云AI代码助手 腾讯云AI代码助手

基于混元代码大模型的AI辅助编码工具

腾讯云AI代码助手 205 查看详情 腾讯云AI代码助手

为了使同一个命令在两种系统上都能成功执行,可以将命令修改为:

sed -i'' -e 's/old_string/new_string/g' /path/to/file
# 或者
sed -i'.bak' -e 's/old_string/new_string/g' /path/to/file

这些命令已经在以下系统上进行了测试:

  • Linux 5.4.0-131-generic #147-Ubuntu
  • Darwin Kernel Version 21.6.0

参考资料:

  • Stack Overflow问题4247068
  • man sed

以上就是带有-i选项的sed命令在Linux上执行成功,但在MacOS上失败的详细内容,更多请关注其它相关文章!

本文转自网络,如有侵权请联系客服删除。