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/file
es 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).