我正在寻找一种安全可靠的方法来覆盖文本文件中的一行。我不在乎它是否使用了sed、grep perl什么的。它只需要是可移植的和可靠的。具体来说,我试图做的是在运行时替换一个变量的值,我已经保存在一个文本文件中。让我们假设我有一个名为variables.txt的文件,其中包含一行读userName = stephen。让'假设我的程序想把userName改为frank,下面是我使用sed得到的结果:
第一个月
我对此的担心是,我读到在一些版本的sed上使用'-i'开关而不指定备份文件可能会导致命令失败或可能的文件损坏风险。不是一个选项。你们怎么看?
编辑
对于那些询问我在哪里读到命令失败和文件损坏的人,我的sed版本的手册页建议不要为-i开关提供空值,并查看this page here上的注解:
看起来有些版本的sed需要在-i后面加上参数,有些则不需要。在GNU sed 4.1.x版本中,-i似乎不需要参数,并且在实际失败后指定一个空参数。
听起来一致的建议是提供一个备份文件,然后在命令完成后删除它。但是,我仍然担心这个解决方案,因为我的sed版本甚至不支持--version开关。我在这里主要关心的是解决方案既可靠又可移植。
4条答案
按热度按时间gojuced71#
你也可以使用
mv
,但这不会保留文件权限如果tempfile不可用,则使用其他方法(巴克)创建文件名。
cgh8pdjw2#
只要不是在windows上运行,sed-i就像任何东西一样安全,即使机器在进程中崩溃,variables.txt也会保留旧内容或新内容--它永远不会丢失或损坏。
piah890a3#
你在哪里读到的?
这并不完全正确:这在sed中并不常见,但是所有的程序(包括sed)都可能失败,并且在极不可能的情况下会损坏数据。2所以你不应该太害怕sed的数据损坏。
无论如何,为什么不使用带有扩展名的
-i
(如-i.bak
)来提供更多的安全性呢?在任何情况下,您都可以使用rm
删除备份文件...bd1hkmkf4#
如果你想保留一个备份,你可以在运行命令之前将variables.txt复制到variables.txt.bak,或者反过来: