Una forma sería:
$ 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
Sin embargo, eso también elimina la nueva línea final. Para agregarlo nuevamente, use:
$ { perl -lne 's/^/\n/ if $.>1 && /^\d+/; printf "%s",$_' file; echo; } > new
Explicación
El -l
eliminará las nuevas líneas finales (y también agregará una a cada print
llamada, por eso lo uso printf
en su lugar. Luego, si la línea actual comienza con números ( /^\d+/
) y el número de línea actual es mayor que uno ( $.>1
, esto es necesario para evitar agregar un extra línea vacía al principio), agregue una \n
al principio de la línea. printf
Imprime cada línea.
Alternativamente, puede cambiar todos los \n
caracteres a \0
, luego cambiar aquellos \0
que están justo antes de una cadena de números a \n
nuevamente:
$ 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
Para que coincida solo con cadenas de 8 números, use esto en su lugar:
$ tr '\n' '\0' < file | perl -pe 's/\0\d{8} |$/\n$&/g' | tr -d '\0'