Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Is there an issue with sed and new line character?
I have a file test.txt with the following contents


The following does not work:
sed -r -i 's/\n/,/g' test.txt

I know that I can use tr for this but my question is why it seems not possible with sed.

If this is a side effect of processing the file line by line I would be interested in why this happens. I think grep removes new lines. Does sed do the same?

share|improve this question
In this case sed might be not the best tool to use (eg. "tr"). There are tools that are more intuitive, easier to read/maintain, performing better (especially on big data) etc. ... Don't use your hammer to put the screws in (even if it works). You can find a comparison on: http://slash4.de/blog/python/sed-replace-newline-or-python-awk-tr-perl-xargs.ht‌​ml – slash4 Feb 26 '15 at 9:51
up vote 12 down vote accepted
sed -i ':a;N;$!ba;s/\n/,/g' test.txt

From http://stackoverflow.com/questions/1251999/sed-how-can-i-replace-a-newline-n :

  1. create a label via :a
  2. append the current and next line to the pattern space via N
  3. if we are before the last line, branch to the created label $!ba ($! means not to do it on the last line (as there should be one final newline)).
  4. finally the substitution replaces every newline with a comma on the pattern space (which is the whole file).
share|improve this answer
This seems to indicate that the problem is that sed reads line by line.But I can't understand why is this an issue.It could just read the line and replace the new line character (or last character) with a , – Jim Feb 12 '14 at 20:27
@jim It looks like it is not in the buffer to be matched, but I am not fluent with sed, maybe someone else can shed a light on that. I think you should extend your Q with that specific info, so people are more likely to read it, and hopefully answer. – Anthon Feb 12 '14 at 20:30
This results in ba: Event not found – krb686 May 21 '15 at 14:07
@krb686 What is the "This" you are referring to? Did you run the above sed command with those exact options? On what test.txt file? With which version of sed (try sed --version)? – Anthon May 21 '15 at 14:39
@Anthon Sorry, I think I meant to say "the". I read another SO post that informed me that csh requires me to escape the !. Interestingly, that still did not work for me and I ended up having to double escape the ! in my .csh script. So I don't really have a problem at the moment, but you do you know why that might be? What worked for me was sed :a;N;$\\!ba;s/\n/ /g' – krb686 May 21 '15 at 17:58

From Oracle's web site:

The sed utility works by sequentially reading a file, line by line, into memory. It then performs all actions specified for the line and places the line back in memory to dump to the terminal with the requested changes made. After all actions have taken place to this one line, it reads the next line of the file and repeats the process until it is finished with the file.

Basically this means that because sed is reading line by line the newline character is not matched.

The solution from http://stackoverflow.com/questions/1251999/sed-how-can-i-replace-a-newline-n is:

sed ':a;N;$!ba;s/\n/ /g'

An explanation into how that works is provided on that page.

share|improve this answer
That will get you spaces between the lines, not commas – Anthon Feb 12 '14 at 20:33
I used a modified form of this to parse VPN logs and put the user "authenticated" and time stamp information on the same line. Cheers! – user38537 Sep 25 '15 at 1:51

Alternatively, you can use a slightly simpler syntax:

sed ':a;N;s/\n/,/g;ba'

...just changing sequence order.

share|improve this answer

sed always removes the trailing \newline just before populating pattern space, and then appends one before writing out the results of its script. A \newline can be had in pattern-space by various means - but never if it is not the result of an edit. This is important - \newlines in sed's pattern space always reflect a change, and never occur in the input stream. \newlines are the only delimiter a sedder can count on with unknown input.

If you want to replace all \newlines with commas and your file is not very large, then you can do:

sed 'H;1h;$!d;x;y/\n/,/'

That appends every input line to hold space - except the first, which instead overwrites hold space - following a \newline character. It then deletes every line not the $!last from output. On the last line Hold and pattern spaces are exchanged and all \newline characters are y///translated to commas.

For large files this sort of thing is bound to cause problems - sed's buffer on line-boundaries, that can be easily overflowed with actions of this sort.

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

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