Вопрос:

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

linux awk sed cat

561 просмотра

2 ответа

102 Репутация автора

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

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

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

Автор: Joe Fruchey Источник Размещён: 01.02.2015 11:41

Ответы (2)


3 плюса

84420 Репутация автора

Чтобы отобразить файл, содержащий последовательности 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 СЭД будет принимать либо -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'
Автор: John1024 Размещён: 02.02.2015 12:25

3 плюса

35549 Репутация автора

Предлагаемый ответ с использованием «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.

Автор: Thomas Dickey Размещён: 05.02.2015 12:42
Вопросы из категории :
32x32