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'