Могу ли я программно "записать" управляющие коды ANSI в файл с помощью утилит unix?

Пример: я начинаю запись с scriptи попробуйте набрать echo test но опустите o, поэтому я возвращаюсь, чтобы исправить это.

Когда я cat typescript все выглядит нормально, так как коды интерпретируются, но если я использую less или же vim я вижу ech test^H^[[K^H^[[K^H^[[K^H^[[K^H^[[Ko test^M

Я полностью понимаю, что это такое и почему это происходит, но есть ли способ "сжечь" коды и просто увидеть результат в файле? Мой хитрый метод заключается в cat файла, затем скопируйте / вставьте текст из терминала, но наверняка какая-то комбинация cat, sed, awk или чего-то еще может помочь мне там легче?

2 ответа

Чтобы отобразить файл, содержащий последовательности ANSI,

less -r typescript

Или же,

less -R typescript

Чтобы удалить последовательности ANSI и Backspace из файла, создав чистую newfile, пытаться:

sed -r ':again; s/[^\x08]\x08\x1b\[K//; t again; s/\x1b_[^\x1b]*\x1b[\]//g; s/\x1B\[[^m]*m//g' typescript >newfile

Как это устроено

  • -r

    Это включает расширенные регулярные выражения. (В системах BSD, -r следует заменить на -E, Современные версии GNU sed будут принимать либо -r или же -E.)

  • `: Снова; s/[^\x08]\x08\ X1B [K//; снова

    Это удаляет любые последовательности возврата. Это делается по одному в цикле.

  • s/\x1b_[^\x1b]*\x1b[\]//g

    Как xterm расширение (см. документацию), Esc _ something Esc \ ничего не сделаю. Эта команда удаляет эти последовательности.

  • s/\x1B\[[^m]*m//g

    Это удаляет оставшиеся последовательности ANSI, которые устанавливают цвета и т. Д.

Это охватывает все контрольные последовательности, с которыми я обычно сталкиваюсь. Существует большое разнообразие расширенных управляющих последовательностей, и, если ваш вывод содержит некоторые, которых я не видел, возможно, потребуется расширить код.

POSIX или BSD sed

В системе BSD или POSIX отдельные команды должны быть связаны вместе с -e варианты вместо точек с запятой. Таким образом, попробуйте:

sed -e ':again' -e 's/[^\x08]\x08\x1b\[K//' -e 't again' -e 's/\x1b_[^\x1b]*\x1b[\]//g' -e 's/\x1B\[[^m]*m//g'

Предложенный ответ с использованием "sed -r" основан на GNU sed, что делает его не очень переносимым. С POSIX sed можно выполнять те же функции, но по-разному: POSIX не предусматривает передачу всего сценария в опции команды, как показано здесь. Это означает, что (POSIX) способ реализовать цикл будет в отдельном файле, передаваемом в sed с помощью опции "-f". Аналогично, шестнадцатеричные константы не являются переносимыми. После внесения этих изменений можно использовать функционально эквивалентный сценарий в системах BSD и Unix.

Предложенный ответ также не охватывает некоторые виды использования возврата каретки, которые являются довольно распространенными (например, при выводе yum), и не отфильтровывает "большинство" последовательностей ANSI (поскольку он фокусируется на последнем символе SGR "m"). Наконец, это относится к

escape _ text _

как расширение xterm. Но xterm не предоставляет такого расширения, потому что два символа "escape" и "_" начинают последовательность команд прикладной программы (а xterm не реализует ни одного).

Результирующий sed-скрипт выглядит следующим образом ("^[" - escape-символ):

s/^[[[][<=>?]\{0,1\}[;0-9]*[@-~]//g
s/^[[]][^^[]*^G//g
s/^[[]][^^[]*^[\\//g
:loop
s/[^^H]^H\(.\)/\1/g
t loop
s/^M^M*$//g
s/^.*^M//g
s/^[[^[]//g

Более полный скрипт с именем "script2log" можно найти здесь. Однако есть вещи (такие как CSI K), которые не подходят для сценария sed.

Другие вопросы по тегам