Uma maneira seria:
$ 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
No entanto, também remove a nova linha final. Para adicioná-lo novamente, use:
$ { perl -lne 's/^/\n/ if $.>1 && /^\d+/; printf "%s",$_' file; echo; } > new
Explicação
O -l
removerá as novas linhas à direita (e também adicionará uma a cada print
chamada, motivo pelo qual eu uso isso printf
. Em seguida, se a linha atual começar com números ( /^\d+/
) e o número da linha atual for maior que um ( $.>1
isso é necessário para evitar adicionar mais linha vazia no início), adicione \n
a ao início da linha e printf
imprime cada linha.
Como alternativa, você pode alterar todos os \n
caracteres para e \0
, em seguida, alterar os \0
que estão corretos antes de uma sequência de números para \n
novamente:
$ 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
Para fazer corresponder apenas cadeias de 8 números, use este:
$ tr '\n' '\0' < file | perl -pe 's/\0\d{8} |$/\n$&/g' | tr -d '\0'