Jednym ze sposobów byłoby:
$ 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
Jednak .that usuwa również ostatnią nową linię. Aby dodać go ponownie, użyj:
$ { perl -lne 's/^/\n/ if $.>1 && /^\d+/; printf "%s",$_' file; echo; } > new
Wyjaśnienie
-lUsunie końcowe znaki nowej linii (a także dodasz do każdej printrozmowy, dlatego używam printfzamiast. Następnie, jeśli obecne rozpoczyna linia z liczb ( /^\d+/) oraz numer bieżącego wiersza jest większy niż jeden ( $.>1jest to konieczne, aby uniknąć dodając dodatkowy pusta linia na początku), dodaj a \nna początku linii. printfDrukuje każdą linię.
Alternatywnie możesz zmienić wszystkie \nznaki na \0, a następnie zmienić te, \0które znajdują się tuż przed ciągiem liczb, aby \nponownie:
$ 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
Aby dopasować tylko ciągi 8 cyfr, użyj tego zamiast tego:
$ tr '\n' '\0' < file | perl -pe 's/\0\d{8} |$/\n$&/g' | tr -d '\0'