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
-l
Usunie końcowe znaki nowej linii (a także dodasz do każdej print
rozmowy, dlatego używam printf
zamiast. Następnie, jeśli obecne rozpoczyna linia z liczb ( /^\d+/
) oraz numer bieżącego wiersza jest większy niż jeden ( $.>1
jest to konieczne, aby uniknąć dodając dodatkowy pusta linia na początku), dodaj a \n
na początku linii. printf
Drukuje każdą linię.
Alternatywnie możesz zmienić wszystkie \n
znaki na \0
, a następnie zmienić te, \0
które znajdują się tuż przed ciągiem liczb, aby \n
ponownie:
$ 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'