22

Let me clear about newline character:

$ echo Hello > file1 ; cat file1
Hello
$ echo -n  Hello > file2 ; cat file2
Hello$ 

Here you can see that file1 has newline character at the end whereas file2 hasn't.

Now suppose I've one file:

$ cat file
Hello
Welcome to
Unix
$

And I want to add and Linux at the end of file, then echo " and Linux" >> file will be added to newline. But I want last line as Unix and Linux

So, In order to work around I want to remove newline character at the end of file. Therefore How do I remove the newline character at the end of file?

  • 5
    Don't remove it, just use a text editor. sed '$s/$/ and linux/' – 123 Jan 11 '16 at 15:01
22

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
  • 1
    Much better way to remove a trailing newline is perl -pi -e 'chomp if eof' myfile. Compared to truncate or dd it not gonna leave you with a broken file if myfile had actually no trailing newlines. – Hi-Angel May 27 at 13:24
12

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:

  1. 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
    
  2. 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.
    
  • is head -c -1 file | tee file safe? Wouldn't tee truncate the file before starting? – iruvar Jan 11 '16 at 17:14
  • 1
    @1_CR Indeed. The two sides of the pipe start in parallel, it's a matter of who wins the race. Since tee only has to open the file, whereas head has to read and write its contents, tee will in practice win the race except sometimes for very small files. – Gilles Jan 11 '16 at 22:46
  • This doesn't remove last newline, it remove all newlines. IMO quite a big difference. – Hi-Angel May 27 at 13:16
1

Here's one way with sed -- on the last ($) line of the file, search and replace anything and everything (.*) with "whatever you matched" followed by " and Linux":

sed '$s/\(.*\)/\1 and Linux/' file
  • This can be shortened to sed '$s/.*/& and Linux/' file. – dessert Dec 18 '17 at 16:21

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.