Один із способів:
$ 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
це потрібно, щоб уникнути додавання додаткового додаткового номера ) порожній рядок на початку), додайте a \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'