我正在寻找一种安全可靠的方法来覆盖文本文件中的一行。我不在乎它是否使用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切换。我主要关注的是该解决方案既可靠又便携。再次感谢。
答案 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