How do I remove the newline from the last line in a file in order to add text to that line?
If all you want to do is add text to the last line, it's very easy with sed. Replace $
(pattern matching at the end of the line) by the text you want to add, only on lines in the range $
(which means the last line).
sed '$ s/$/ and Linux/' <file >file.new &&
mv file.new file
which on Linux can be shortened to
sed -i '$ s/$/ and Linux/' file
If you want to remove the last byte in a file, Linux (more precisely GNU coreutils) offers the truncate
command, which makes this very easy.
truncate -s -1 file
A POSIX way to do it is with dd
. First determine the file length, then truncate it to one byte less.
length=$(wc -c <file)
dd if=/dev/null of=file obs="$((length-1))" seek=1
Note that both of these unconditionally truncate the last byte of the file. You may want to check that it's a newline first:
length=$(wc -c <file)
if [ "$length" -ne 0 ] && [ -z "$(tail -c -1 <file)" ]; then
# The file ends with a newline or null
dd if=/dev/null of=file obs="$((length-1))" seek=1
fi
Though, you can remove newline character from line by tr -d '\n'
:
$ echo -e "Hello"
Hello
$ echo -e "Hello" | tr -d '\n'
Hello$
You can remove the newline character at the end of file using following easy way:
head -c -1 file
From
man head
:-c, --bytes=[-]K print the first K bytes of each file; with the leading '-', print all but the last K bytes of each file
truncate -s -1 file
from
man truncate
:-s, --size=SIZE set or adjust the file size by SIZE
SIZE is an integer and optional unit (example: 10M is 10*1024*1024). Units are K, M, G, T, P, E, Z, Y (powers of 1024) or KB, MB, ... (powers of 1000). SIZE may also be prefixed by one of the following modifying characters: '+' extend by, '-' reduce by, '<' at most, '>' at least, '/' round down to multiple of, '%' round up to multiple of.
You can achieve this with perl as:
perl -pi -e 'chomp if eof' myfile
Compared to truncate
or dd
this not gonna leave you with a broken file if myfile
had actually no trailing newlines.
(the answer is constructed from the comment, and based on this answer)