使用Bash Sed替换文本时文件被截断,原因何在?
问题原因分析
你的脚本导致abc文件被清空,核心是两个错误叠加的结果:
1. sed选项组合导致空输出覆盖原文件
你使用了sed -ni参数组合:
-n:强制sed抑制默认输出(原本sed会把所有处理后的行自动打印到输出流)-i:让sed就地修改原文件——原理是将处理后的内容写入临时文件,最后用临时文件替换原文件
而你的替换命令s/$myip/$newip/没有添加p标记(用于打印匹配并修改后的行),再加上变量未被正确解析,没有任何行被匹配替换,最终sed没有产生任何输出。空内容被-i写入原文件,直接清空了abc。
2. 单引号屏蔽了bash变量解析
sed脚本用单引号包裹:'s/$myip/$newip/',而bash中单引号会完全阻止变量替换,所以sed实际是在匹配字面量$myip,而非你定义的变量值1.2.3.4,自然找不到任何匹配行,进一步导致没有输出内容。
修复方案
要正确完成替换并保留原文件的其他内容,需要调整两个点:
- 改用双引号让bash解析变量,或在单引号外拼接变量
- 去掉
-n选项(让sed默认输出所有行,替换行自动更新,未匹配行原样保留)
正确的脚本写法:
#!/bin/bash myip=1.2.3.4; newip=5.6.7.8 sed -i "s/$myip/$newip/" abc
如果担心IP中的.被当作正则元字符(.在正则中匹配任意字符)导致误替换,可以用\Q和\E将变量包裹,强制sed按字面量匹配:
sed -i "s/\Q$myip\E/$newip/" abc
内容的提问来源于stack exchange,提问作者user37342
相关产品推荐
相关产品推荐

