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

We are having a file in Linux which contains one line per record, but problem comes when the line contains some new line characters. In this case, the backslash is appended at the end of line and the record is split into multiple lines. So below is my problem:

"abc def \
xyz pqr"

should be:

"abc def xyz pqr"

I tried sed -I 's/\\\n/ /g' <file_name> which is not working. I also tried the tr command but it replaces only one character, not the string. Can you please suggest any command to handle this issue.

share|improve this question
up vote 7 down vote accepted

You should be able to use

sed -e :a -e '/\\$/N; s/\\\n//; ta'

See Peter Krumins' Famous Sed One-Liners Explained, Part I, 39. Append a line to the next if it ends with a backslash "\".

share|improve this answer
while read twolines
do printf %s\\n "$twolines"
done <file

...which is what I suspect was the intended destiny for that file anyway. With sed you might do:

sed 'N;s/\([^\\]\)\\\n/\1/;P;D' <file

...which would at least protect backslash quoted quotes, though it misses backslash quoted backslash quoted quotes. Yeah, it's kind of a nightmare regex-wise, but the while read...done thing handles all of those cases properly. Admittedly, though, with some adaptation, steeldriver's solution could reliably handle all cases, too, because the t command can recurse once per successful substitution.

Still, if that's not a problem then:

sed 'N;s/\\\n//;P;D' <file

...does the job.

share|improve this answer

You can use awk:

$ awk 'sub(/\\$/,""){printf("%s", $0);next};1' file
"abc def xyz pqr"
share|improve this answer

The shorter solution seems to be with perl:

perl -pe 's/\\\n//'
share|improve this answer

Another awk variation

awk '{ORS = /\\/? "": RS; sub(/\\$/, ""); print}' file
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.