Remove backslash + newline sequences

7,490

Solution 1

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 "\".

Solution 2

You can use awk:

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

Solution 3

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.

Solution 4

The shorter solution seems to be with perl:

perl -pe 's/\\\n//'

Solution 5

Another awk variation

awk '{ORS = /\\/? "": RS; sub(/\\$/, ""); print}' file
Share:
7,490

Related videos on Youtube

Deepak
Author by

Deepak

Updated on September 18, 2022

Comments

  • Deepak
    Deepak over 1 year

    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.

  • done
    done almost 6 years
    This only process two consecutive lines. Try str=$'foo bar \\\nbash 1 \\\nbash 2 \\\nbash 3 \\\nbash 4 \\\nbaz\ndude \\\nhappy\nxxx\nvvv 1 \\\nvvv 2 \\\nCCC'; echo "$str" | sed 'N;s/\([^\\]\)\\\n/\1/;P;D'.
  • mikeserv
    mikeserv almost 6 years
    @Isaac - yeah. to do more than that the t command is referred for pattern-space recursion. the N;...P;D sliding window solutions are usually tailored for outside max handles - theyre often a good means of optimizing a test loop... though a combination of the two techniques with the test laid out ahead of either or both of the substitution and N/next line grab as applied after a Delimited deletion can arbitrarily recurse nested/differed quote contexts at minimal retainer for streamed ops. essentially a bookmarked mem jump... anyway, your $str doesnt have any double-quotes.