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

Las*_*yer 4 bash shell sudo sed echo

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

创建文件很简单:

sudo touch /etc/myfile
Run Code Online (Sandbox Code Playgroud)

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

sudo echo "something" > /etc/myfile
Run Code Online (Sandbox Code Playgroud)

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

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

sudo sed -i -e "\$aInsert this" /etc/differntfile
Run Code Online (Sandbox Code Playgroud)

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

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

fed*_*qui 5

你可以使用tee:

echo "something" | sudo tee /etc/myfile   # tee -a to append
Run Code Online (Sandbox Code Playgroud)

/dev/null如果您不想看到输出,请重定向到:

echo "something" | sudo tee /etc/myfile > /dev/null
Run Code Online (Sandbox Code Playgroud)

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

sudo sh -c 'echo "something" > /etc/myfile'
Run Code Online (Sandbox Code Playgroud)

关于这样做sed:我不认为这是可能的.由于sed 是一个流编辑器,如果没有流,它就无法用它做任何事情.

  • 如果在使用*sudo sh -c*执行的命令中使用变量,则必须使用双引号. (2认同)

Ing*_*kat 5

如果您愿意从sed(我也认为不能这样做)升级到awk(GNU awk 4.1.0 或更高版本),可以这样做:

sudo gawk -i inplace '{ print } ENDFILE { print "something" }' /etc/myfile
Run Code Online (Sandbox Code Playgroud)

已接受答案给出的替代方案可能更容易;我只需要这样的用例,我可以只使用一个简单的 shell 命令(所以没有重定向),并且文件必须作为单个独立参数传递(所以没有将sh -c目标文件嵌入到其单个参数中)。与 不同的是sedawk还可以处理不完整的最后一行(缺少尾随换行符)而不添加此类内容。

这使用了就地awk 源库;man 3am inplace详情请参阅。