如何使用 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
。
我有以下问题:在脚本中,不能以 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
。