Um caminho 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, isso 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 finais (e também adicionará uma a cada print
de chamadas, motivo pelo qual eu uso printf
. Então, se a linha atual começar com números ( /^\d+/
) e a linha atual number é maior que um ( $.>1
, isso é necessário para evitar adicionar uma linha extra vazia no início), adicione um \n
ao início da linha. O printf
imprime cada linha.
Como alternativa, você pode alterar todos os caracteres \n
para \n
e, em seguida, alterar os %code% que estão à direita antes de uma sequência de números para %code% novamente:
$ tr '\n' '$ tr '\n' ' $ 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
' < file | perl -pe 's/$ { perl -lne 's/^/\n/ if $.>1 && /^\d+/; printf "%s",$_' file; echo; } > new
\d{8} |$/\n$&/g' | tr -d '$ tr '\n' '$ tr '\n' '%pre%' < file | perl -pe 's/%pre%\d{8} |$/\n$&/g' | tr -d '%pre%'
' < file | perl -pe 's/%pre%\d+ |$/\n$&/g' | tr -d '%pre%'
20141101 server contain dump
20141101 server contain nothing {uekdmsam ikdas jwdjamc ksadkek} ssfjddkc * kdlsdlsddsfd jfkdfk
20141101 server contain dump
'
' < file | perl -pe 's/%pre%\d+ |$/\n$&/g' | tr -d '%pre%'
20141101 server contain dump
20141101 server contain nothing {uekdmsam ikdas jwdjamc ksadkek} ssfjddkc * kdlsdlsddsfd jfkdfk
20141101 server contain dump
Para fazer com que corresponda apenas a strings de 8 números, use isto:
%pre%