Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 覆盖文本文件中的一行_Perl_Sed_Awk_Grep - Fatal编程技术网

Perl 覆盖文本文件中的一行

Perl 覆盖文本文件中的一行,perl,sed,awk,grep,Perl,Sed,Awk,Grep,我正在寻找一种安全可靠的方法来覆盖文本文件中的一行。我不在乎它是否使用sed、grep、perl等等。它只需要便携和可靠。具体来说,我要做的是替换我在运行时保存在文本文件中的变量的值。假设我有一个名为variables.txt的文件,其中包含一行,读作userName=stephen。假设我的程序想要将用户名更改为frank。以下是我使用sed的想法: sed-i''s/userName.*/userName=frank/'variables.txt 我对此的担忧是,我已经了解到,在某些版本的s

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

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

我对此的担忧是,我已经了解到,在某些版本的sed上,在不指定备份文件的情况下使用“-I”开关可能会导致命令失败或可能导致文件损坏。没有选择。你们觉得怎么样?如有任何建议,将不胜感激

--编辑--

对于那些问我在哪里读到命令失败和文件损坏的人。我的sed版本的手册页建议不要为-i开关提供空值,并查看“似乎sed的某些版本需要在-i之后进行论证,而其他版本则不需要。对于GNU sed版本4.1.x,-i似乎不需要参数,并且在实际失败后指定空参数。”


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

您可以复制va如果要保留备份,请在运行命令之前将riables.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 
您也可以使用
mv
,但这不会保留文件权限


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

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

我担心的是,我已经在某些版本的sed上使用“-i”swit读到了这一点如果不指定备份文件,可能会导致命令失败或有文件损坏的风险

你在哪里读的

严格来说这不是事实:这在sed中不是一个常见的问题,但所有程序(包括sed)都可能失败,并且在极不可能的情况下会损坏数据。因此,您不应该太担心sed会损坏数据


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

“[…]擦除备份文件,这可能会导致命令失败或可能导致文件损坏“我能问一下你从哪里读到的吗?你说,我主要关心的是这个解决方案既可靠又可移植。那么,只需将扩展名传递给
-i
标志!AFAIK所有sed版本都支持带有值的此选项。即使是我有限的BSD sed(来自Mac OS X)也支持它。如果您传递
-i
的参数,您将获得便携性和安全性!
t=`tempfile`
sed -e 's/userName.*/userName=frank/' variables.txt >$tempfile
cp $tempfile >variables.txt
rm $tempfile