How to append multiple lines to a file
I am writing a bash script to look for a file if it doesn’t exist then create it and append this to it:
Host localhost
ForwardAgent yes
So "line then new line 'tab' then text"
I think its a sensitive format.
I know you can do this:
cat temp.txt >> data.txt
But it seems weird since its two lines. Is there a way to append that in this format:
echo "hello" >> greetings.txt
# 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
# possibility 4 (more about input than output):
arr=( 'line 1' 'line 2' );
printf '%sn' "${arr[@]}" >> greetings.txt
If sudo (other user privileges) is needed to write to the file, use this:
# 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
printf '%sn %sn' 'Host localhost' 'ForwardAgent yes' >> file.txt
Or, if it’s a literal tab that you want (rather than the four spaces in your question):
printf '%snt%sn' 'Host localhost' 'ForwardAgent yes' >> file.txt
You can achieve the same effect with echo
, but exactly how varies from implementation to implementation, whereas printf
is consistent.
echo -e "Hello nWorld n" >> greetings.txt
SED can append a line to the end of a file like so:
sed -i '$ a text to be inserted' fileName.file
$
selects end of file, the a
tells it to append, and after this comes the text that is to be inserted. Then of course the file name.
Source:
http://www.yourownlinux.com/2015/04/sed-command-in-linux-append-and-insert-lines-to-file.html
==========EDIT============
Does this approach have any added benefit than other solutions?
Yes, this approach has the added benefit of appending to any files return in a search, such as this:
find . -name "*.html" -exec sed -i '$ a </html>' {} ;
I used the above example to insert the ending html tag that was missing on every html page within a number of directories.
===================================
I used sed because it can be used with sudo. For example:
sudo sed -i '$ a text to be inserted' fileName.file
the alternative is very ugly like :
sudo bash -c "echo a text to be inserted >> fileName.file"
and even uglier when done with ssh.
Another one liner is:
echo "Greetings 1" >> greetings.txt && echo "Greetings 2" >> greetings.txt
I’d prefer the -e
option thought, as it gives more control:
echo -e "Greeting 1nGreetings 2n" >> greetings.txt
Another approach is to use tee
tee -a ~/.ssh/config << END
Host localhost
ForwardAgent yes
END
A few choice lines from tee
‘s man page:
The tee utility copies standard input to standard output, making a
copy in zero or more files.-a – Append the output to the files rather than overwriting them.
One can emulate cat >> out.txt
with either Perl or Python to achieve same effect. Perl:
perl -e 'open(fh,">>","./out.txt");while(<>){printf(fh "%s",$_)};close(fh);'
And Python:
python -c 'import sys;f=open(sys.argv[1],"a");l=[i for i in sys.stdin];f.write("".join(l))' out.txt
Note that for python you’ll have to hit Ctrl+D twice. See related question on stackoverflow for more info.
Here is an example to append multiple lines in a file:
{
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
In addition to main answer, in case the file needs super user permissions, just adding sudo
in front of echo
won’t work.
This is because shell breaks the commands and though echo
did run as root, but >>
ran with normal privileges.
This will work for super user:
sudo su -c "echo 'Line 3' >> greetings.txt"