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

How to append line to empty file using sed, but not echo?

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

创建文件很简单:

sudo touch /etc/myfile

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

sudo echo "something" > /etc/myfile

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

以前我用过类似的东西...

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

...添加到文件的末尾,这是有效的,因为文件不是空的。但是由于 sed 是基于行的,所以它什么都不做,文件完全是空的。

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

您可以使用 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 是一个流编辑器,如果没有流,它就无能为力了。

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