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 -l
akan menghapus trailing baris (dan juga menambahkan satu ke setiap print
panggilan yang mengapa saya menggunakan printf
sebagai 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 \n
ke awal baris. printf
Mencetak setiap baris.
Atau, Anda dapat mengubah semua \n
karakter menjadi \0
, lalu mengubah karakter \0
yang tepat sebelum serangkaian angka \n
lagi:
$ 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'