前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >带有-i选项的sed命令在Linux上执行成功,但在MacOS上失败

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

作者头像
程序熵
发布2023-09-25 10:59:19
2660
发布2023-09-25 10:59:19
举报
文章被收录于专栏:技术汇技术汇

问:

我已经成功地使用以下sed命令在Linux中搜索/替换文本:

代码语言:javascript
复制
sed -i 's/old_string/new_string/g' /path/to/file

然而,当我在Mac OS X上尝试时,我得到:

代码语言:javascript
复制
command i expects \ followed by text

我以为我的Mac运行的是一个正常的BASH shell。这是怎么了?

答:

在 Linux 系统上使用命令 man sed 查看手册,

NAME sed - stream editor for filtering and transforming text

简介是用于过滤和转换文本的流编辑器。再翻到对 -i 选项的描述部分,

-i[SUFFIX], --in-place[=SUFFIX] edit files in place (makes backup if SUFFIX supplied)

就地编辑文件(如果提供了后缀,则进行备份),可见参数后缀 SUFFIX 是可选的,即带或者不带这个参数都可以执行。

在 MacOS 系统上使用命令 man sed 查看手册,

NAME sed – stream editor

简介是流编辑器。再翻到对 -i 选项的描述部分,

以类似于 -I 的方式就地编辑文件,但将每个文件与其他文件独立处理。特别是,每个文件中的行号从1开始,“$” 地址与当前文件的最后一行匹配,并且地址范围仅限于当前文件。最终结果是,每个文件都由一个单独的 sed 实例编辑。可见 -i 后面是必选参数 extension,不写上扩展名参数就会报错,于是命令执行失败。

如果要同一个命令在两种系统上都成功执行,可写成:

代码语言:javascript
复制
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

参考:

  • stackoverflow question 4247068
  • man sed

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-06-18 18:18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序熵 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档