如何在文件中追加多行


301

我正在编写一个bash脚本来查找文件(如果不存在),然后创建该文件并将其附加到该文件:

Host localhost
    ForwardAgent yes

因此,"line then new line 'tab' then text"我认为它是一种敏感格式。我知道您可以这样做:

cat temp.txt >> data.txt

但自从两行开始,这似乎很奇怪。有没有办法以这种格式附加它:

echo "hello" >> greetings.txt

Answers:


526
# possibility 1:
echo "line 1" >> greetings.txt
echo "line 2" >> greetings.txt

# possibility 2:
echo "line 1
line 2" >> greetings.txt

# possibility 3:
cat <<EOT >> greetings.txt
line 1
line 2
EOT

如果需要sudo(其他用户特权)来写入文件,请使用以下命令:

# possibility 1:
echo "line 1" | sudo tee -a greetings.txt > /dev/null

# possibility 3:
sudo tee -a greetings.txt > /dev/null <<EOT
line 1
line 2
EOT

2
@TheLegend称为“此处文档”。在手册页中查看该段落。
Hauke Laging 2013年

1
还有一种可能是( echo "line 1" ; echo "line 2" ) >>greetings.txt
ott--

2
@ ott--您不需要真正的子外壳(即可以保存一个新进程),这就足够了:{ echo "line 1" ; echo "line 2"; } >>greetings.txt
Hauke Laging 2013年

2
EOT和EOL有什么区别?
cikatomo,2016年

15
@cikatomo中cat <<EOTEOT只是一个随机字符串。也可能是cat <<FOO
Hauke Laging

60
printf '%s\n    %s\n' 'Host localhost' 'ForwardAgent yes' >> file.txt

或者,如果您要使用的是文字标签(而不是问题中的四个空格):

printf '%s\n\t%s\n' 'Host localhost' 'ForwardAgent yes' >> file.txt

您可以使用来达到相同的效果echo,但具体实现因实施而异,而这printf是不变的。



16

另一种方法是使用 tee

tee -a ~/.ssh/config << END
Host localhost
  ForwardAgent yes
END

tee的手册页中的一些选择行:

tee实用程序将标准输入复制到标准输出,从而以零个或多个文件进行复制。

-a-将输出追加到文件,而不是覆盖它们。


6

SED可以像这样在文件末尾添加一行:

sed -i '$ a text to be inserted' fileName.file
$选择文件末尾,a告诉它要附加,然后是要插入的文本。然后当然是文件名。


来源:http : //www.yourownlinux.com/2015/04/sed-command-in-linux-append-and-insert-lines-to-file.html

========== EDIT == ==========

这种方法是否比其他解决方案有更多好处?
是的,这种方法的另一个好处是可以将任何附加到搜索中的文件追加到该文件中,例如: find . -name "*.html" -exec sed -i '$ a </html>' {} \;

我使用上面的示例插入了许多目录中每个html页面上缺少的结尾html标记。

==================================


1
如果您将显示在文件中追加多行的语法,那么这将是该问题的答案(尽管不是很有用)。所有其他答案只需编写新文本即可。该答案将读取整个文件并重写它以及添加的文本。这种方法比其他方法有什么好处吗?
G-Man

这仅适用于GNU sed。BSD sed因错误而失败command a expects \ followed by text。因此,请勿将其用于脚本解决方案;容易断裂。(或者做正确的所需的BSD语法是POSIX兼容和GNU将工作sed为好。
通配符

其他答案可以find按如下方式使用:find . -name "*.txt" -exec sh -c 'printf "%s\n\t%s\n" "Host localhost" "ForwardAgent yes" >> "$1"' sh {} ";"
G-Man

1
这是一个非常好的解决方案,因为它不执行流重定向(>>>),因此不会遭受诸如运行之类的问题sudo echo 'something' > /file。对我来说,它完全可以在lxd容器中的文件上添加一行,如下所示:lxc exec c sed -- '$ a newline' /myfile
Draco Ater

echo "a new line" >> foo.file不会创建一个新线的时候,文件没有结束新的生产线,但sed -i '$ a a new line' foo.file会做,这样sed比较好尤其是你想始终追加一个新行添加到文件。
zhouji 2013年

1

我使用sed是因为它可以与sudo一起使用。例如:

sudo sed -i '$ a text to be inserted' fileName.file 

替代方案非常丑陋,例如:

sudo bash -c "echo a text to be inserted >> fileName.file"  

使用ssh完成后甚至更难看。


1
为什么这个答案被否决?这看起来像我需要的解决方案。有什么问题吗?如果没有,我将使用它并对其进行投票。
MountainX

sed -i不以扩展名作为参数吗?您的示例可能有不正确的参数。
protometa

1

另一个班轮是:

echo "Greetings 1" >> greetings.txt && echo "Greetings 2" >> greetings.txt

我更喜欢-e选项思想,因为它提供了更多控制权:

echo -e "Greeting 1\nGreetings 2\n" >> greetings.txt


1

这是在文件中追加多行的示例:

{
        echo '  directory "/var/cache/bind";'
        echo '  listen-on { 127.0.0.1; };'
        echo '  listen-on-v6 { none; };'
        echo '  version "";'
        echo '  auth-nxdomain no;'
        echo '  forward only;'  
        echo '  forwarders { 8.8.8.8; 8.8.4.4; };'
        echo '  dnssec-enable no;'
        echo '  dnssec-validation no;'
} >> your_file.txt

0

除主要答案外,如果文件需要超级用户权限,则仅sudo在前面添加echo将不起作用。

这是因为shell破坏了命令,尽管echo确实以root身份运行,但>>以普通特权运行。

这将适用于超级用户: sudo su -c "echo 'Line 3' >> greetings.txt"


您不需要su这里(sudo su不好)。但是您是对的,您需要做一些事情来管理shell重定向;也许吧sudo sh -c "echo stuff >> file.txt"。没有节余,而是更好的做法。
roaima
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.