Bunun bir yolu:
$ 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
Ancak, bu son satırsonu da kaldırır. Tekrar eklemek için şunu kullanın:
$ { perl -lne 's/^/\n/ if $.>1 && /^\d+/; printf "%s",$_' file; echo; } > new
açıklama
-lHer bir tane ekleyin da yeni satır sondaki (ve kaldıracaktır printkullandığım yüzden çağrı printfyerine. Daha sonra, sayı (mevcut hat başlar eğer /^\d+/) ve akım çizgisi sayısı (birden yüksekse $.>1, bu bir ekstra eklemekten kaçının gereklidir başında boş hat), bir ekleme \nsatırın başına kadar. printfher satırı yazdırır.
Alternatif olarak, tüm \nkarakterleri olarak \0değiştirebilir, ardından \0bir sayı dizesinden hemen önce olan karakterleri \ntekrar olarak değiştirebilirsiniz:
$ 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
Yalnızca 8 rakamlı dizelerle eşleşmesi için bunun yerine şunu kullanın:
$ tr '\n' '\0' < file | perl -pe 's/\0\d{8} |$/\n$&/g' | tr -d '\0'