Aplicar caracteres de escape na saída redirecionada

3

Estou executando um programa que imprime vários caracteres de escape (como "Esc [1A", para mover o cursor uma linha acima) e tentando redirecionar a saída para um arquivo de log. Quando eu executo o programa sem redirecionamento, a saída final é algo como isto:

256 lines processed.

Mas quando eu redirecionar para um arquivo de log, isso é o que o arquivo acaba parecendo:

Processing line 1...
Esc[1AProcessing line 2...
Esc[1AProcessing line 3...
...
Esc[1AProcessing line 256...
Esc[1A256 lines processed.

O que está acontecendo é que no terminal, o caractere "Esc [1A" está dizendo ao cursor para fazer o backup, para que cada linha sucessiva substitua a última linha e, no final, apenas a última linha seja exibida. p>

Eu quero que o arquivo de log apareça exatamente como a saída final do programa apareceria sem redirecionamento. Eu sei que é possível canalizar a saída para col -bp para filtrar os caracteres de escape, mas eu gostaria de aplicar eles, para que meus arquivos de log não acabem contendo milhares de linhas externas. Como posso conseguir isso?

    
por Thucydides411 10.03.2015 / 04:04

1 resposta

1

Você tem que limpar essas fugas enquanto as lê - faça o que o terminal faz e sobrescreva-as.

Isso emula a saída que você descreve com seq :

seq -s "
$(printf '3[A')" 10

Se for gravada em um terminal que interpreta essa saída, aparecerá apenas 10 . Mas, como você nota na pergunta, é realmente imprimir todos esses números um sobre o outro. No entanto, se eu filtrar sua saída com sed like:

seq -s "
$(printf '3[A')" 10 |
sed -e :n -e "\$!N;s/.*$(printf '3\[A')//;tn"

... ele realmente imprime apenas 10 porque sed continuamente lê em cada linha de entrada seguinte e s/// substitui tudo da cabeça do espaço padrão até a última ocorrência chave para cima escape. E cada vez que o faz com sucesso, ele volta ao :n label para t ry novamente.

    
por 10.03.2015 / 04:38