Могу ли я программно "записать" управляющие коды 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.