问:
我已经成功地使用以下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
测试过的系统:
参考: