วิธีหนึ่งจะเป็น:
$ 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'