perl 覆盖文本文件中的单行

neekobn8  于 2022-12-27  发布在  Perl
关注(0)|答案(4)|浏览(151)

我正在寻找一种安全可靠的方法来覆盖文本文件中的一行。我不在乎它是否使用了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开关。我在这里主要关心的是解决方案既可靠又可移植。

gojuced7

gojuced71#

t=`tempfile`
sed -e 's/userName.*/userName=frank/' variables.txt >$tempfile
cp $tempfile >variables.txt
rm $tempfile

你也可以使用mv,但这不会保留文件权限
如果tempfile不可用,则使用其他方法(巴克)创建文件名。

cgh8pdjw

cgh8pdjw2#

只要不是在windows上运行,sed-i就像任何东西一样安全,即使机器在进程中崩溃,variables.txt也会保留旧内容或新内容--它永远不会丢失或损坏。

piah890a

piah890a3#

  • 我对此的担心是,我已经了解到,在某些版本的sed上,使用'-i'开关而不指定备份文件可能会导致命令失败或可能的文件损坏风险。*

你在哪里读到的?
这并不完全正确:这在sed中并不常见,但是所有的程序(包括sed)都可能失败,并且在极不可能的情况下会损坏数据。2所以你不应该太害怕sed的数据损坏。
无论如何,为什么不使用带有扩展名的-i(如-i.bak)来提供更多的安全性呢?在任何情况下,您都可以使用rm删除备份文件...

bd1hkmkf

bd1hkmkf4#

如果你想保留一个备份,你可以在运行命令之前将variables.txt复制到variables.txt.bak,或者反过来:

sed  's/userName.*/userName=frank/' variables.txt > variables.txt.fixed
if [ $? -eq 0 ]
then 
   cp variables.txt.fixed variables.txt 
fi

相关问题