覆盖文本文件中的单行

时间:2011-07-24 18:19:23

标签: perl sed awk grep

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

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

我对此的担忧是,我在某些版本的sed上使用'-i'开关而未指定备份文件时可能会导致命令失败或冒可能的文件损坏。不是一种选择。你们有什么感想?任何建议将不胜感激。

- 编辑 -

对于那些询问我在哪里读到命令失败和文件损坏的人。我的sed版本的联机帮助页建议不要为-i开关提供空值以及查看this page here:上的注释“似乎某些版本的sed需要在-i之后的参数而其他版本执行使用GNU sed版本4.1.x,似乎-i不需要参数并在实际失败后指定一个空参数。“

听起来一致的建议是提供一个bkup文件,然后在命令完成后删除它。但是我仍然担心这个解决方案,因为我的sed版本甚至不支持--version切换。我主要关注的是该解决方案既可靠又便携。再次感谢。

4 个答案:

答案 0 :(得分:1)

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

您也可以使用mv但不保留文件权

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

我对此的担忧是,我在某些版本的sed上使用'-i'开关而未指定备份文件时可能会导致命令失败或冒可能的文件损坏。

你在哪里看过它?

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

的数据损坏

无论如何,为什么不使用带有扩展名的-i(例如-i.bak)来获得更高的安全性?在任何情况下,您都可以使用rm ...

删除备份文件

答案 3 :(得分:0)

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