使用sed -i编辑文件时生成临时文件,如何禁用?
关于sed -i生成临时文件的问题
问题背景
你在脚本中使用以下sed命令编辑文件:
sed -i -e /NumberOfEntries=*/d "$playlist_name" > /dev/null # 删除包含NumberOfEntries=的行 sed -i -e '/^$/d' "$playlist_name" > /dev/null # 删除所有空行
命令可正常工作,但执行过程中及执行后短时间内会出现类似sedJjHEt2的随机命名临时文件,带有锁标记和红色叉号,想知道:
- 是否可以禁用这类临时文件?
- 是否是
-i选项导致的?
解答
1. 临时文件确实由-i选项导致
GNU sed的-i(就地编辑)选项的工作机制就是:
- 先将处理后的内容写入一个随机命名的临时文件
- 处理完成后,用临时文件替换原文件
- 最后自动删除临时文件
之所以用临时文件,是为了保护原文件的完整性——如果sed在处理中途崩溃,原文件不会被破坏,只会留下未清理的临时文件。
2. 无法禁用临时文件生成
这是-i选项的核心安全机制,没有办法直接禁用。强行绕过这个机制(比如直接写入原文件)会带来数据损坏的风险,不建议尝试。
3. 优化方案:减少临时文件数量
你当前的命令执行了两次sed -i,会生成两次临时文件。可以把两个编辑操作合并成一次执行,这样只会生成一个临时文件,同时提升效率:
sed -i -e '/NumberOfEntries=.*/d' -e '/^$/d' "$playlist_name" > /dev/null
通过多个-e参数传递编辑脚本,一次完成两个删除操作,减少临时文件的生成次数,也降低了残留的概率。
补充说明
如果偶尔出现临时文件残留(比如进程被意外中断),手动删除即可;正常执行完成后,sed会自动清理这些临时文件。
内容的提问来源于stack exchange,提问作者Davider
相关产品推荐
相关产品推荐

