FreeBSD下sed -i变量替换字符串失效,如何修改代码?
解决FreeBSD下sed原地替换失效的问题
这问题我碰到过好多次了——BSD系的sed和咱们常用的GNU sed(比如Linux上的)在-i选项的处理上有个关键区别!
你原来的命令在GNU sed里没问题,但FreeBSD的sed要求-i后面必须指定备份文件的后缀:
- 如果不需要保留原文件的备份,你得给
-i加个空字符串参数''; - 同时还要注意,你直接写
line和new变量是不会被shell解析替换的,得用${line}和${new}让shell把变量值代入进去。
修改后的命令应该是这样:
sed -i '' "s@${line}@${new}@" output_file
额外说明:
- 如果想保留原文件的备份(比如存成
output_file.bak),只需要把空字符串换成备份后缀:
执行后原文件会变成sed -i .bak "s@${line}@${new}@" output_fileoutput_file.bak,修改后的内容写入output_file。 - 要是你的
line或者new变量里包含了@符号(因为咱们用@做sed替换的分隔符),记得要转义这个符号,或者换个其他分隔符(比如#或者|),避免sed把它当成分隔符解析出错。
内容的提问来源于stack exchange,提问作者lowcase_m
相关产品推荐
相关产品推荐

