Salah satu caranya adalah:
$ 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
Namun, itu juga menghapus baris terakhir. Untuk menambahkannya lagi, gunakan:
$ { perl -lne 's/^/\n/ if $.>1 && /^\d+/; printf "%s",$_' file; echo; } > new
Penjelasan
The -lakan menghapus trailing baris (dan juga menambahkan satu ke setiap printpanggilan yang mengapa saya menggunakan printfsebagai gantinya. Kemudian, jika baris saat ini dimulai dengan angka ( /^\d+/) dan nomor baris saat ini lebih besar dari satu ( $.>1, ini diperlukan untuk menghindari menambahkan ekstra baris kosong di awal), tambahkan a \nke awal baris. printfMencetak setiap baris.
Atau, Anda dapat mengubah semua \nkarakter menjadi \0, lalu mengubah karakter \0yang tepat sebelum serangkaian angka \nlagi:
$ 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
Untuk membuatnya hanya cocok dengan string 8 angka, gunakan ini sebagai gantinya:
$ tr '\n' '\0' < file | perl -pe 's/\0\d{8} |$/\n$&/g' | tr -d '\0'