एक तरीका होगा:
$ 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
हालाँकि, यह भी अंतिम newline को निकालता है। इसे फिर से जोड़ने के लिए, उपयोग करें:
$ { perl -lne 's/^/\n/ if $.>1 && /^\d+/; printf "%s",$_' file; echo; } > new
व्याख्या
-l
नई-पंक्तियों अनुगामी (और यह भी प्रत्येक के लिए एक जोड़ने निकाल देंगे print
कॉल है, जिसके कारण मैं का उपयोग printf
करने के बजाय। तो फिर, अगर संख्या (के साथ मौजूदा लाइन शुरू होता है /^\d+/
) और वर्तमान लाइन संख्या एक से अधिक (है $.>1
, इस एक अतिरिक्त जोड़ने से बचने के लिए की जरूरत है शुरुआत में खाली लाइन), लाइन की शुरुआत में एक जोड़ें \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'