54

How can I replace all newlines with space except the last newline. I can replace all newline to space using tr but how I can do it with some exceptions?

6 Answers 6

61

You can use paste -s -d ' ' file.txt:

$ cat file.txt
one line
another line
third line
fourth line

$ paste -s -d ' ' file.txt 
one line another line third line fourth line
1
  • 1
    Cool! The -s and -d options seem like made for this case. Feb 8, 2014 at 22:08
18

You can use tr to replace all newlines to space and pass the output to sed and replace the last space back to a newline:

tr '\n' ' ' < afile.txt | sed '$s/ $/\n/'
7

Re-implementing vonbrand's idea in Perl, provided the file is small enough:

perl -p00e 's/\n(?!\Z)/ /g' your_file
1
  • +1 because this method works for replacements with multibyte characters (as opposed to GNU paste)
    – myrdd
    Dec 21, 2018 at 16:27
-1

This worked for me.

tr '\n' ' ' < file_with_new_line   | sed 's/\ $//g' > file_with_space
3
  • That will remove the last newline as well.
    – terdon
    Feb 29, 2016 at 8:58
  • I don't think so, it is working fine. Have you really tried it???
    – Abhijit
    Mar 1, 2016 at 11:20
  • Yes I have. Have you? Your tr command replaces all newlines with spaces and your sed command removes the last space. This results in a file without a final newline and so is not what the question is asking for. By the way, there's no point int using g in the sed command. Since you're using $, it can only match at the end, the g is pointless. You also don't need to escape the space, the `` makes no difference either.
    – terdon
    Mar 1, 2016 at 12:14
-1

you can use this trick: echo $(cat file.txt)

1
  • Not if there are multiple (adjacent) spaces, or empty or all-space lines, or any word in the file contains shell 'glob' characters/constructs (* ? [..]) that match any file(s) in the current directory, or depending on your shell sometimes even if they don't match. Or if the file size exceeds approximately ARG_MAX on shells where echo isn't builtin. Jul 5, 2021 at 5:29
-2

Something like sed -e 's;\n\(.\); \1;' should do...

Your Answer

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