Одним из способов будет:
$ 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
Однако, это также удаляет заключительный перевод строки. Чтобы добавить его снова, используйте:
$ { perl -lne 's/^/\n/ if $.>1 && /^\d+/; printf "%s",$_' file; echo; } > new
объяснение
Он -lудалит завершающие символы новой строки (а также добавит одну к каждому printвызову, поэтому я использую printfвместо этого. Затем, если текущая строка начинается с цифр ( /^\d+/), а номер текущей строки больше единицы ( $.>1это необходимо, чтобы избежать добавления дополнительных пустая строка в начале), добавьте \nв начало строки printf.Печатает каждую строку.
Кроме того, вы можете изменить все \nсимволы на \0, а затем изменить те, \0которые находятся прямо перед строкой чисел, \nснова:
$ 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
Чтобы он соответствовал только строкам из 8 чисел, используйте вместо этого:
$ tr '\n' '\0' < file | perl -pe 's/\0\d{8} |$/\n$&/g' | tr -d '\0'