覆盖文本文件中的单行



我正在寻找一种安全可靠的方式来覆盖文本文件中的一行。不管它用的是sed, grep还是perl。它只需要便携和可靠。具体来说,我要做的是替换我在运行时保存在文本文件中的变量的值。假设我有一个名为variables.txt的文件,其中包含这样一行:userName=stephen。假设我的程序想要将userName更改为frank。下面是我使用sed:

得到的结果

sed -i '' 's/userName.*/userName=frank/' variables.txt

我担心的是,在某些版本的sed上,使用'-i'开关而不指定备份文件可能会导致命令失败或冒可能的文件损坏的风险。这不是一个选择。你们怎么看?

编辑

对于那些问我在哪里读到的命令失败和文件损坏。我的sed版本的手册建议不要为-i开关提供空值,并查看该页面的注释:

似乎有些版本的sed需要在-i之后加上参数,而其他版本则不需要。使用GNU sed版本4.1。X,似乎-i不需要参数,也不需要在实际失败后指定空参数。

听起来一致的建议是提供一个备份文件,然后在命令完成后删除它。然而,我仍然担心这个解决方案,因为我的sed版本甚至不支持——version开关。这里我主要关心的是解决方案既可靠又可移植。

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

您也可以使用mv,但这不会保留文件权限

如果tempfile不可用,则使用其他方法($$ .bak)来创建文件名

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

我担心的是,在某些版本的sed中,使用'-i'开关而不指定备份文件可能会导致命令失败或冒可能的文件损坏的风险。

你在哪里读到的?

这不是严格正确的:这不是sed 中常见的问题,但是所有程序(包括sed)都可能失败,并且在非常不可能的情况下损坏数据。所以你不应该太担心sed的数据损坏。

无论如何,为什么不使用-i与扩展(如-i.bak)授予更多的安全性?在任何情况下,你可以擦除备份文件与rm

如果希望保留备份,可以在运行命令之前将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 

最新更新