Une façon serait:
$ 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
Cependant, cela supprime également la nouvelle ligne finale. Pour l'ajouter à nouveau, utilisez:
$ { perl -lne 's/^/\n/ if $.>1 && /^\d+/; printf "%s",$_' file; echo; } > new
Explication
Le -l
supprimera les sauts de ligne (et en ajoutera également un à chaque print
appel, c'est pourquoi j'utilise à la printf
place. Ensuite, si la ligne actuelle commence par des nombres ( /^\d+/
) et que le numéro de ligne actuel est supérieur à un ( $.>1
, cela est nécessaire pour éviter d'ajouter un supplément ligne vide au début), ajoutez un \n
au début de la ligne pour printf
imprimer chaque ligne.
Alternativement, vous pouvez remplacer tous les \n
caractères par \0
, puis changer à nouveau ceux \0
qui se trouvent juste avant une chaîne de chiffres \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
Pour qu'il ne corresponde qu'à des chaînes de 8 chiffres, utilisez-le à la place:
$ tr '\n' '\0' < file | perl -pe 's/\0\d{8} |$/\n$&/g' | tr -d '\0'