it-swarm.cn

如何在文件中追加多行

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

Host localhost
    ForwardAgent yes

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

cat temp.txt >> data.txt

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

echo "hello" >> greetings.txt
346
TheLegend
# 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
604
Hauke Laging
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是恒定的。

64
evilsoup
echo -e "Hello \nWorld \n" >> greetings.txt
42
kendotwill

另一种方法是使用tee

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

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

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

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

22
user206934

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标记。

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

6
OB7DEV

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

{
        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
3
user2753331

我使用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
Fred Mehrdad

一个可以模仿cat >> out.txt与Perl或Python可以达到相同的效果。Perl:

Perl -e 'open(fh,">>","./out.txt");while(<>){printf(fh "%s",$_)};close(fh);'

和Python:

python -c 'import sys;f=open(sys.argv[1],"a");l=[i for i in sys.stdin];f.write("".join(l))' out.txt 

请注意,对于python,您必须 Ctrl+D 两次。有关更多信息,请参见 有关stackoverflow的相关问题

1
Sergiy Kolodyazhnyy

另一个班轮是:

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

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

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

除了主要答案外,如果文件需要超级用户权限,则仅在Sudo前面添加echo是行不通的。

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

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

0
SJ00