Могу ли я программно «записать» управляющие коды ANSI в файл с помощью утилит unix?
561 просмотра
2 ответа
Пример: я начинаю запись с 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 или чего-то еще может помочь мне там легче?
Ответы (2)
3 плюса
Предлагаемый ответ с использованием «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:423 плюса
Чтобы отобразить файл, содержащий последовательности 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
Вопросы из категории :
- linux Как отправить файл в виде вложения электронной почты с помощью командной строки Linux?
- linux Как разделить два 64-битных числа в ядре Linux?
- linux Изучение файлов Беркли БД из CLI
- linux Как передать пароль на scp?
- linux Как показать все общие библиотеки, используемые исполняемыми файлами в Linux?
- awk Формирование порядка полей вывода из команды вырезать
- awk Есть ли платформы Unix, где Perl не установлен по умолчанию?
- awk Как удалить дубликаты строк в файле, не сортируя его в Unix?
- awk awk '{print $ 9}' последний столбец ls -l, включая все пробелы в имени файла
- awk Как сделать рекурсивный поиск / замену строки с помощью awk или sed?
- sed Как я могу извлечь предопределенный диапазон строк из текстового файла в Unix?
- sed Как удалить первую строку текстового файла с помощью сценария bash / sed?
- sed Избегайте строки для шаблона замены sed
- sed Используя sed, как вы печатаете первые 'N' символов строки?
- sed upper- to lower-case using sed
- cat Объединить несколько файлов, но включить имя файла в качестве заголовка раздела
- cat Как мне прочитать первую строку, используя кошку
- cat Вывести вывод оператора cat в цикле bash-скрипта
- cat Объединение файлов и вставка новой строки между файлами
- cat Бесполезное использование кошки?