【发布时间】:2011-07-24 18:19:22
【问题描述】:
我正在寻找一种安全可靠的方法来覆盖文本文件中的一行。我不在乎它是否使用 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: 上的 cmets “似乎某些版本的 sed 需要 -i 之后的参数,而其他版本则不需要。使用 GNU sed 4.1.x 版,似乎 -i 不需要参数并在实际失败后指定空参数。”
听起来一致的建议是提供一个 bkup 文件,然后在命令完成后将其删除。但是我仍然担心这个解决方案,因为我的 sed 版本甚至不支持 --version 开关。我主要关心的是该解决方案既可靠又便携。再次感谢。
【问题讨论】:
-
"[…] 可能导致命令失败或可能导致文件损坏" 请问您是从哪里读到的?
-
我主要关心的是该解决方案既可靠又便携,你说。好吧,只需将扩展名传递给
-i标志! AFAIK all sed 版本支持带有值的此选项。甚至我有限的 BSD sed(来自 Mac OS X)也支持它。如果您传递-i的参数,您将获得便携性和安全性!