问题:
我已经成功地使用以下 sed
命令在Linux中搜索/替换文本:
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
查看手册,
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,不写上扩展名参数就会报错,于是命令执行失败。
如果要同一个命令在两种系统上都成功执行,可写成:
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
相关阅读:
- 为什么我不能在脚本中使用“cd“来更改目录
- 2>&1是什么意思
- 如何使用bash脚本并行运行多个程序
- 为什么要使用xargs命令
- xargs命令用法实例