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
-l
Her bir tane ekleyin da yeni satır sondaki (ve kaldıracaktır print
kullandığım yüzden çağrı printf
yerine. 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 \n
satırın başına kadar. printf
her satırı yazdırır.
Alternatif olarak, tüm \n
karakterleri olarak \0
değiştirebilir, ardından \0
bir sayı dizesinden hemen önce olan karakterleri \n
tekrar 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'