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
-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
-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, "https://unix.stackexchange.com/" round down to multiple of, '%' round up to multiple of.
You can achieve this with perl as:
perl -pi -e 'chomp if eof' myfile
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)