如何使用sed将行附加到空文件,但不是echo?

时间:2016-08-01 11:42:28

标签: bash shell sed echo sudo

我有以下问题:在脚本中,不能以root身份执行,我必须在新创建的空文件中写一行。这个文件在/ etc中,所以我需要提升的特权来写入它。

创建文件很简单:

sudo touch /etc/myfile

现在,只是使用echo来写这样的文件是行不通的......

sudo echo "something" > /etc/myfile

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

以前我用过这样的东西......

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

...添加到文件的末尾,这有效,因为该文件不为空。但是由于sed基于行工作,它没有做任何事情,文件保持完全为空。

有什么建议吗?有没有办法用回声以某种方式做到这一点?有什么特别的sed表达吗?我可以使用的其他工具吗?

2 个答案:

答案 0 :(得分:5)

您可以使用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 :(得分:4)

如果您愿意从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