¿Cómo usar sed para reemplazar cada aparición de un patrón menos un caso?

¿Cómo usar sed para reemplazar cada aparición de un patrón menos un caso?

Tengo un archivo temporal generado por un trabajo cron cada media hora que genera un resultado como este:

---- kind=<data> field=<value> humankind=<data> kind=<data> field=<value> humankind=<data> kind=<data> field=<value> humankind=<data>

Quiero formatearlo para que se vea así:

---- kind=<data> field=<value> humankind=<data>
kind=<data> field=<value> humankind=<data>
kind=<data> field=<value> humankind=<data>

He probado las siguientes expresiones sed:

sed -r 's|\s(kind=)|\n\1|g' /path/to/file

Pero entonces el resultado se ve así:

----                                         <------ The first line should be here
kind=<data> field=<value> humankind=<data>
kind=<data> field=<value> humankind=<data>
kind=<data> field=<value> humankind=<data>

Usando esta expresión:

sed -r 's|[^-]{4} (kind=)|\n\1|g' /path/to/file

Genera el resultado que quiero, pero con un comportamiento extraño:

---- kind=<data> field=<value> humankind=<incomplete data>
kind=<data> field=<value> humankind=<incomplete data>
kind=<data> field=<value> humankind=<incomplete data>

Por alguna razón, el último campo (que contiene parte del patrón utilizado en la expresión sed) solo imprime los dos primeros caracteres de "datos incompletos".

¿Qué estoy haciendo mal?

Respuesta1

El problema sed -r 's|\s(kind=)|\n\1|g' /path/to/filees que insertas una nueva línea para todas las apariciones de 'tipo', incluida la primera, por lo que obtienes una nueva línea adicional después ----. En lugar de eso, intenta

sed -E 's|\s(kind=)|\n\1|2g' /path/to/file

ya que se saltará el primer partido.

El segundo falla porque coincide con 4 caracteres antes de "tipo", y eso es parte de sus datos (que deben tener 6 caracteres).

información relacionada