How to append Line to previous Line?
A version in perl
, using negative lookaheads:
$ perl -0pe 's/\n(?!([0-9]{8}|$))//g' test.txt
20141101 server contain dump
20141101 server contain nothing {uekdmsam ikdas jwdjamc ksadkek} ssfjddkc * kdlsdlsddsfd jfkdfk
20141101 server contain dump
-0
allows the regex to be matched across the entire file, and \n(?!([0-9]{8}|$))
is a negative lookahead, meaning a newline not followed by 8 digits, or end of the line (which, with -0
, will be the end of the file).
May be a little bit easy with sed
sed -e ':1 ; N ; $!b1' -e 's/\n\+\( *[^0-9]\)/\1/g'
first part
:1;N;$!b1
collect all lines in file divided by\n
in 1 long linesecond part strip newline symbol if it followed non-digit symbol with possible spaces between its.
To avoid memory limitation (espesially for big files) you can use:
sed -e '1{h;d}' -e '1!{/^[0-9]/!{H;d};/^[0-9]/x;$G}' -e 's/\n\+\( *[^0-9]\)/\1/g'
Or forget a difficult sed
scripts and to remember that year starts from 2
tr '\n2' ' \n' | sed -e '1!s/^/2/' -e 1{/^$/d} -e $a
One way would be:
$ perl -lne 's/^/\n/ if $.>1 && /^\d+/; printf "%s",$_' file
20141101 server contain dump
20141101 server contain nothing {uekdmsam ikdas jwdjamc ksadkek} ssfjddkc * kdlsdlsddsfd jfkdfk
20141101 server contain dump
However, .that also removes the final newline. To add it again, use:
$ { perl -lne 's/^/\n/ if $.>1 && /^\d+/; printf "%s",$_' file; echo; } > new
Explanation
The -l
will remove trailing newlines (and also add one to each print
call which is why I use printf
instead. Then, if the current line starts with numbers (/^\d+/
) and the current line number is greater than one ($.>1
, this is needed to avoid adding an extra empty line at the beginning), add a \n
to the beginning of the line. The printf
prints each line.
Alternatively, you can change all \n
characters to \0
, then change those \0
that are right before a string of numbers to \n
again:
$ tr '\n' '\0' < file | perl -pe 's/\0\d+ |$/\n$&/g' | tr -d '\0'
20141101 server contain dump
20141101 server contain nothing {uekdmsam ikdas jwdjamc ksadkek} ssfjddkc * kdlsdlsddsfd jfkdfk
20141101 server contain dump
To make it match only strings of 8 numbers, use this instead:
$ tr '\n' '\0' < file | perl -pe 's/\0\d{8} |$/\n$&/g' | tr -d '\0'