1つの方法は次のとおりです。
$ 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
ただし、それによって最後の改行も削除されます。再度追加するには、次を使用します。
$ { perl -lne 's/^/\n/ if $.>1 && /^\d+/; printf "%s",$_' file; echo; } > new
説明
-l末尾の改行を削除(ともそれぞれに1が追加されますprint私が使用する理由であるコールprintfの代わりに。その後、現在の行は、(数字で始まる場合/^\d+/()と現在の行数が1以上である$.>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'