Một cách sẽ là:
$ 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
Tuy nhiên, .that cũng loại bỏ dòng mới cuối cùng. Để thêm lại, sử dụng:
$ { perl -lne 's/^/\n/ if $.>1 && /^\d+/; printf "%s",$_' file; echo; } > new
Giải trình
Các -lsẽ loại bỏ trailing dòng mới (và cũng có thể thêm một cho mỗi printcuộc gọi đó là lý do tôi sử dụng printfđể thay thế. Sau đó, nếu hiện tại bắt đầu phù hợp với con số ( /^\d+/) và số dòng hiện nay là lớn hơn một ( $.>1, điều này là cần thiết để tránh thêm một thêm dòng trống ở đầu), thêm a \nvào đầu dòng. printfIn mỗi dòng.
Ngoài ra, bạn có thể thay đổi tất cả các \nký tự thành \0, sau đó thay đổi các \0ký tự ngay trước một chuỗi số thành \nmột lần nữa:
$ 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
Để làm cho nó chỉ khớp với chuỗi 8 số, thay vào đó, hãy sử dụng chuỗi này:
$ tr '\n' '\0' < file | perl -pe 's/\0\d{8} |$/\n$&/g' | tr -d '\0'