Reputation: 505
I need to merge line of a file using sed based on a pattern. eg:
Input File:
X1 A B C D E F
\+ G H I J 1
\+ LK T PP E OO 2
X2 DDF F Y
\+ J W Q
....
OutPut Expected:
X1 A B C D E F G H I J 1 LK T PP E OO 2
X2 DDF F Y J W Q
..
I would like to equivalent of wat is possible in vi editor (:%s/\n+/ /g)
Searching the web I found a solution, which logically should have worked
sed -e '{:a; N; s/\n+/ /g; ta}' infile
But this command defies my understanding and logic, and has produced output
X1 A B C D E F
\+ G H I J 1 LK T PP E OO 2
X2 DDF F Y
\+ J W Q
....
Upvotes: 7
Views: 10412
Reputation: 3753
potong's answer didn't work for me, but something similar works:
sed -e :a -e '$!N;s/\n+//;ta' -e 'P;D' file
Good sed docs here: http://sed.sourceforge.net/sedfaq3.html
Upvotes: 0
Reputation: 195059
an alternative awk oneliner:
awk 'BEGIN{RS=" "}{gsub(/\n\n\+/,"")}1' yourFile
Upvotes: 3
Reputation: 58420
This might work for you:
sed ':a;$!N;s/\n+//;ta;P;D' file
explanation:
:a
is a loop placeholder$!N
means if not end-of-file append next line to current line.s/\n+//
means delete an end on line followed by a plus signta
means if last substitution worked branch to a
loop placeholderP
print upto the first newline.D
delete upto and including the first newline.Upvotes: 23