วิธีหนึ่งจะเป็น:
$ 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
อย่างไรก็ตาม. thats ยังลบ newline สุดท้าย หากต้องการเพิ่มอีกครั้งให้ใช้:
$ { perl -lne 's/^/\n/ if $.>1 && /^\d+/; printf "%s",$_' file; echo; } > new
คำอธิบาย
-lจะลบต่อท้ายบรรทัดใหม่ (และยังเพิ่มหนึ่งไปยังแต่ละprintโทรซึ่งเป็นเหตุผลที่ผมใช้printfแทน. แล้วถ้าเส้นเริ่มต้นในปัจจุบันมีตัวเลข ( /^\d+/) และจำนวนบรรทัดปัจจุบันมีมากกว่าหนึ่ง ( $.>1นี้เป็นสิ่งจำเป็นเพื่อหลีกเลี่ยงการเพิ่มเป็นพิเศษ บรรทัดว่างที่จุดเริ่มต้น) เพิ่ม a \nไปยังจุดเริ่มต้นของบรรทัดprintfพิมพ์แต่ละบรรทัด
หรือคุณสามารถเปลี่ยนทุก\nตัวอักษร\0แล้วเปลี่ยนผู้\0ที่มีสิทธิก่อนสตริงของตัวเลขไป\nอีกครั้ง:
$ 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
ในการทำให้ตรงกับสตริงที่มีตัวเลข 8 ตัวให้ใช้แทน:
$ tr '\n' '\0' < file | perl -pe 's/\0\d{8} |$/\n$&/g' | tr -d '\0'