После обновления:
awk '/^--/{printf "\n\n"; f=0; next }
!f { printf "%-29s%s\n", $0, "LOG:"; f=1; next}
/^$/{next}
/LOG:/{next}
{sub(/ */,""); printf "%-29s%s\n", "", $0}' file
Это близко к тому, что вы хотите, но мне пришлось добавить дополнительный пробел во второе сообщение журнала, чтобы оно заработало:
awk 'BEGIN{RS="\n> -- *\n *"; FS=" +" }
{ gsub(/\n>|LOG:/,"") }
{ sub(/^ /,"",$1); sub(/:*$/,":",$1); printf "%-29s%s\n",$1,"LOG:"}
{ for(i=2;i<=NF; ++i) printf "%-29s%s\n","",$i; printf "\n\n" }' file
Идея состоит в том, чтобы awk определял записи, которые делятся на \n> -- *\n *
, и поля, которые делятся на несколько пробелов (поэтому мне нужно было добавить дополнительный пробел после +++++++++++...
).
выход:
2/1/1/2/tasdfn.c: LOG:
backslash-newline should be deleted before tokenizing
No diagnostics line
2/1/1/2/tlsdf.c: LOG:
+++ stderr ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tlsdf.c:15:5: error: use of undeclared identifier 't'
2/2/4/1/tasdf.gen(0): LOG:
511 external identifiers in one source file
Compilation failed ungracefully
2/2/4/1/tiasdf.gen(0): LOG:
8 nesting levels of #include files
Compilation failed ungracefully --
исходный ввод:
> 2/1/1/2/tasdfn.c:
>
> LOG: backslash-newline should be deleted before tokenizing No
> diagnostics line
> --
>2/1/1/2/tlsdf.c:
>
> LOG:
> +++ stderr
>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>tlsdf.c:15:5: error: use of undeclared identifier 't'
> --
> 2/2/4/1/tasdf.gen(0):
>
> LOG: 511 external identifiers in one source file Compilation failed
> ungracefully
> --
>2/2/4/1/tiasdf.gen(0)::
>
> LOG: 8 nesting levels of #include files Compilation failed
> ungracefully
> --