Ok, eu descobri a mim mesmo.
Usando o script c aqui , e modificando um pouco, consegui o que precisava.
A modificação que participou foi a seguinte:
porque eu queria o ???
sublinhado na frente de cada erro, mudei o loop na linha 107 para imprimir ??? antes de percorrer o restante do erro. Isso foi assim:
if (buffer[0] == 27)
dontcol = 1;
if (buffer[0] == '\n')
dontcol = 0;
if (!dontcol)
fputs(begstr, stdout);
fputs(" if (buffer[0] == 27)
dontcol = 1;
if (buffer[0] == '\n')
dontcol = 0;
if (!dontcol)
fputs(begstr, stdout);
fputs("%pre%33[4m??? 3[0m", stdout);
putchar(buffer[0]);
if (!dontcol)
fputs(endstr, stdout);
for (i = 1; i < n; i++)
{
if (buffer[i] == 27)
dontcol = 1;
if (buffer[i] == '\n')
dontcol = 0;
if (!dontcol)
fputs(begstr, stdout);
putchar(buffer[i]);
if (!dontcol)
fputs(endstr, stdout);
}
33[4m??? 3[0m", stdout);
putchar(buffer[0]);
if (!dontcol)
fputs(endstr, stdout);
for (i = 1; i < n; i++)
{
if (buffer[i] == 27)
dontcol = 1;
if (buffer[i] == '\n')
dontcol = 0;
if (!dontcol)
fputs(begstr, stdout);
putchar(buffer[i]);
if (!dontcol)
fputs(endstr, stdout);
}