如何使用sed而不是echo将行添加到空文件中?

11

我有以下问题:在一个不应该以root身份执行的脚本中,我需要向一个新创建的空文件写入一行。这个文件位于/etc目录下,所以我需要提升权限才能写入。

创建文件很简单:

sudo touch /etc/myfile

现在,仅仅像这样使用 echo 写入文件是不起作用的...

sudo echo "something" > /etc/myfile

...因为只有命令的第一部分(echo)使用sudo执行,而不是重定向到文件中。

以前我使用了这样的方法...

sudo sed -i -e "\$aInsert this" /etc/differntfile

我尝试使用sed命令向文件末尾添加内容,因为文件不为空,所以这种方式可以成功。但由于sed是基于行的操作,它并没有做任何操作,文件仍然完全为空。

有什么建议吗?有没有办法用echo实现这个目的?有没有特殊的sed表达式?还有其他工具可以使用吗?

2个回答

11

您可以使用tee命令:

echo "something" | sudo tee /etc/myfile   # tee -a to append

如果您不想看到输出,可以将其重定向到/dev/null

echo "something" | sudo tee /etc/myfile > /dev/null

另外一种选项是使用sh -c在sudo下执行完整命令:

sudo sh -c 'echo "something" > /etc/myfile'

关于使用sed进行此操作:我认为这是不可能的。由于sed是一个流编辑器,如果没有流,它就无法处理任何东西。



1
这解决了问题。简短而直截了当 ++ - sjsam
1
太好了,这比我预想的要容易得多。 - Lasse Meyer
2
如果您在使用 sudo sh -c 命令执行时使用变量,则必须使用双引号。 - Lasse Meyer

5

如果你愿意从 sed(我认为也不能做到这一点)升级到 awk(确切地说是GNU awk 4.1.0或更高版本),可以这样做:

sudo gawk -i inplace '{ print } ENDFILE { print "something" }' /etc/myfile

被接受的回答提供的替代方案可能更容易; 我只需要一个这样的用例,其中我可以使用简单的Shell命令(因此没有重定向),并且文件必须作为单独的独立参数传递(因此没有嵌入目标文件的`sh -c`)。与sed不同,awk还处理不完整的最后一行(缺少尾随换行符)而不添加它。
这使用inplace awk源库;有关详细信息,请参阅`man 3am inplace`。

1
这个答案与被接受的答案不同,它正确处理了文件的最后一行没有以新行字符终止的情况。谢谢! - Alek
1
“man 3am inplace” 是值得阅读的,特别是对于那些想知道这里到底在发生什么的人。;) - dannysauer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接