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 -l
sẽ loại bỏ trailing dòng mới (và cũng có thể thêm một cho mỗi print
cuộ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 \n
vào đầu dòng. printf
In mỗi dòng.
Ngoài ra, bạn có thể thay đổi tất cả các \n
ký tự thành \0
, sau đó thay đổi các \0
ký tự ngay trước một chuỗi số thành \n
mộ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'