Применение символов Escape в перенаправленном выходе

Я запускаю программу, которая печатает много символов escape (например, «Esc [1A», чтобы переместить курсор вверх на одну строку) и пытается перенаправить вывод в файл журнала. Когда я запускаю программу без перенаправления, окончательный вывод выглядит примерно так:

256 lines processed. 

Но когда я перенаправляюсь к файлу журнала, это то, что файл выглядит так:

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

Что происходит в терминале, символ «Esc [1A» говорит курсору для резервного копирования, так что каждая последующая строка перезаписывает последнюю строку, а в конце отображается только последняя строка.

Я хочу, чтобы файл журнала отображался точно так же, как конечный вывод программы появлялся без перенаправления. Я знаю, что можно col -bp вывод в col -bp , чтобы отфильтровать escape-символы, но я бы хотел применить их, чтобы мои файлы журналов не содержали тысячи посторонних строк. Как я могу это достичь?

  • Как я могу получить SQL-запросы для отображения в выходном файле?
  • Непоследовательное поведение перенаправления ввода
  • Как скопировать вывод pacman-color в файл и отобразить вывод с цветами в терминале
  • Добавление работ без >> при перенаправлении стандартного вывода и ошибки
  • Перенаправить вывод сценария в / dev / tty1, а также отобразить вывод в файл
  • Как осуществляется перенаправление?
  • Копирование или перенаправление текста в качестве входа в UART, необходимо обеспечить более медленную пропускную способность
  • Как я могу подавить ненужный вывод emacsclient?
  • One Solution collect form web for “Применение символов Escape в перенаправленном выходе”

    Вам нужно очистить эти экраны, когда вы их читаете, – делайте то, что делает терминал, и перезаписывайте их.

    Это эмулирует вывод, который вы описываете w / seq :

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

    Если он выписывает терминал, который интерпретирует этот выход, он будет печатать только 10 . Но, как вы заметили в вопросе, это действительно печатает все эти числа друг над другом. Однако, если я фильтрую его вывод с sed как:

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

    … он действительно печатает только 10 потому что sed постоянно читает в каждой следующей строке ввода и s/// убирает все, начиная от головы пространства шаблонов и заканчивая последней победой ключа . И каждый раз, когда он делает это успешно, он снова возвращается к метке :n .

    Interesting Posts

    Почему `.` отображается` ls`?

    Как отменить / TRIM диапазон в открытом файле?

    Сенсорный экран распознается как мышь в Arch Linux – как я могу включить multi-touch с ним и распознать его как сенсорный экран?

    Как открыть PDF-файл с помощью PuTTY в качестве терминала?

    Объединение строк текста с повторным началом

    различные контрольные суммы исходного файла и скопированного файла

    Переименуйте несколько файлов, подкаталогов и вставьте символы в определенном месте на OSX

    изменения rhosts и повторная инициализация

    OpenSSH-Server: как я могу удаленно установить заголовок окна боковой панели клиента?

    Как переименовать раздел UDF?

    Почему пакет «harden» пакетов недоступен для Debian Jessie (8.0)?

    Как я могу использовать строковые манипуляции для обнаружения и удаления двух разных частей строки?

    Невозможно добавить файл подкачки на Solaris

    Как добавить к переменной среды с помощью файла .env?

    Telnet отправить Ctrl-C

    Linux и Unix - лучшая ОС в мире.