Aqui está uma solução Perl:
$ perl -pe 's/(\d+:.*?)(?=\d+:|$)/$1\n/g' file
random_string
83: some words
45: large error report
326: send emails to certain peple
random_string
34: some words
143: job success
Explicação
-
(\d+:.*?)
: corresponde a um ou mais números (\d+
) seguidos por:
e, em seguida, a menor string (o?
in.*?
torna-o não-voraz, parará assim que o primeiro fósforo é encontrado) correspondendo ao resto do regex. Aqui, continuará até a parte explicada abaixo. -
(?=\d+:|$)
: o(?=foo)
é chamado de lookahead positivo . Ele corresponderá, mas o que corresponder não será incluído no resultado real. Portanto,bar(?=foo)
corresponderá a todos os casos debar
que forem seguidos porfoo
. Aqui, estamos procurando por uma sequência de números seguida por um:
(\d+:
) ou o final da linha ($
).
Agora, o operador de substituição substituirá todas as ocorrências do primeiro padrão por si próprio e uma nova linha que deverá fornecer a saída desejada.