Assuming i have a line that i want to add to a file without opening an editor.
How could i append this line
alias list='ls -cl --group-directories-first'
to this file
config.fish
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It only takes a minute to sign up.
Sign up to join this communityYou can append a line of text to a file by using the >>
operator:
echo "hello world" >> my_file.txt
or in your case
echo "alias list='ls -cl --group-directories-first'" >> config.fish
Please take note of the different types of quotes.
>
then the file will truncate, not append. for a safer command you can use sed: sed -i '$a hello world' filename
-i
will update the file (otherwise it will just print the result to stdout), $
is regex that will match the end of the file, and a
appends the following text to filename.
echo "hello world" >> my_file.txt
does not create a new last line with HW
, but add it to the string of the last line.
echo
that adds the line break (making it a line as opposed to just a bunch of characters). You can switch off the line break at the end with -n
.
Jul 3, 2018 at 14:59
Adding to Stefano's answer, you can also use cat
:
Using a heredoc:
$ cat >> config.fish <<'EOF'
> alias list='ls -cl --group-directories-first'
> EOF
<<'EOF'
means "take the following as input, until you reach a line that is just EOF
". The quotes mean to take the input literally.
Or inputting the line on stdin:
$ cat >> config.fish
Then paste or type in the line, press Enter to go to a new line, then press Ctrl+D to mark the end.
There's plenty of methods of appending to file without opening text editors, particularly via multiple available text processing utilities in Ubuntu. In general, anything that allows us to perform open()
syscall with O_APPEND
flag added, can be used to append to a file.
GNU version of dd
utility can append data to file with conv=notrunc oflag=append
printf "\nalias list='ls -cl --group-directories-first'\n" | dd conv=notrunc oflag=append bs=1 of=config.fish
Portably we could use something like this on the right side of pipeline:
dd conv=notrunc seek=$(wc -c < testFile.txt) bs=1 of=testFile.txt
Note the use of bs=1
, which is to prevent short reads from pipeline
The tee
command can be used when you need to append to file and send it to stdout or to next command in pipeline
tee -a config.fish <<< "alias list='ls -cl --group-directories-first'"
awk
has append operator >>
which is also portable and defined by POSIX specifications
awk 'BEGIN{ printf "alias list=\x27ls -cl --group-directories-first\x27\n" >> "config.fish" }'
We can combine sed
's flag $
to match the last line with a
for appending and -i
for in-place editing.
sed -i '$a alias list='"'"'ls -cl --group-directories-first'"'" config.fish
We could even implement something like dd
in Python 3:
#!/usr/bin/env python3
# read bytes from stdin, append to specified file
import sys
with open(sys.argv[1],'ab') as f:
f.write(sys.stdin.buffer.read())