Как преобразовать escape-последовательности в текст с сохранением формата отображения?

Как Кусаланандасказал , любое значение меньше нуля неприемлемо для других пользователей, а любое значение больше нуля приятно для других пользователей. Я не смог найти документацию, в которой бы это было ясно, но вы можете увидеть это в исходном кодеprocps:

.

if(pp->nice < 0)                  outbuf[end++] = '<';
if(pp->nice > 0)                  outbuf[end++] = 'N';

Если вас особенно интересует Linux, см.man 7 schedдля подробной информации о его политиках планирования. Недружественные приятные уровни традиционно могут быть установлены только с помощью root, но непривилегированным процессам можно разрешить делать это в Linux, повысив лимит ресурсов RLIMIT_NICE.

3
31.01.2021, 16:33
3 ответа

Простой способ использовать команду усечения с опцией удаления. \033 представляет escape-символ.

$cat ваше _имя файла|tr -d \033 > сохранить _имя файла

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

$cat ваше _имя файла|tr -d [:cntrl :] > сохранить _имя файла



Надеюсь, это поможет

-1
18.03.2021, 22:37

Файл содержит ряд escape-последовательностей(последовательность символов ^[является escape-символом):

  • ^[[2J, очищает экран.

  • ^[[H, перемещает курсор в верхнюю часть экрана.

  • ^[[x;yH, перемещает курсор в позицию (x,y).

    Это означает, что файл в основном использует абсолютное позиционирование текста на экране.

  • ^[[Kочищает до конца строки.

Файл также содержит несколько символов возврата каретки, которые мы можем захотеть удалить.

Мы можем удалить большинство из них, но для простоты заменить последовательности «перейти к (x,y)» одной новой строкой. К счастью, каждое подобное позиционирование просто перемещает курсор вниз на строку и делает отступ на четыре пробела (, нет «непоследовательных» строк текста ).

sed -e $'s/\e\\[2J//g' \
    -e $'s/\e\\[H//g' \
    -e $'s/\e\\[[[:digit:]]*;[[:digit:]]*H/@    /g' -e 'y/@/\n/' \
    -e $'s/\e\\[K//g' \
    -e $'s/\r//g' file

Замены здесь выполняются с использованием строк C -в оболочке ($'...', поддерживаемых, например. bashиzsh)для кодирования escape-символов.

Каждая ^[[x;yHпоследовательность заменяется новой строкой и четырьмя пробелами отступа в два -шага; сначала заменив их на@    (@любой символ, который иначе не присутствует в данных ), а затем замените каждый @новой строкой, используя y///. Это связано с тем, что s///не может вставлять новые строки (, хотя GNU sedможет ).

Мы также можем работать с выходными данными при выполнении cat -vданных. Это делает некоторые управляющие символы видимыми -не двусмысленным образом.

$ cat -v file
^[[H^[[2J^[[1;1H^M
^[[4;4H                          CONFIDENTIAL INFORMATION^[[K^[[5;4H^[[K^[[6;4H^[[K^[[7;4HThis work contains valuable, confidential, and proprietary information.^[[K^[[8;4HDisclosure, use, or reproduction is governed by your License Agreement.^[[K^[[10;4H^[[K^[[11;4HThis unpublished work is protected by the laws of the United States and^[[K^[[12;4Hother Countries.  The work was created in 1988 and revised in 1994.  ^[[K^[[13;4HIf publication occurs, the following notice shall apply:^[[K^[[14;4H^[[K^[[15;4H^[[K^[[16;4H   Copyright 1988,1994. All rights reserved.^[[K^[[17;4H^[[K^[[18;4H^[[K^[[19;4HThis Copyright notice and other copyright notices included in the machine^[[K^[[20;4Hreadable copies must be reproduced on all authorized copies.^[[K^[[21;4H^[[K^[[22;4HThis is a registered trademark.^[[K^M

Здесь мы можем использовать следующую sedкоманду:

cat -v file |
sed -e 's/\^\[\[2J//g' \
    -e 's/\^\[\[H//g' \
    -e 's/\^\[\[[[:digit:]]*;[[:digit:]]*H/@    /g' -e 'y/@/\n/' \
    -e 's/\^\[\[K//g' \
    -e 's/\^M//g'

Обратите внимание, что вариант -vдля catне является стандартным, но выходные данные реализаций cat, поддерживающих его, кажутся согласованными.

В некоторых системах утилита visможет использоваться вместо cat -v, но она генерирует другие видимые представления управляющих символов.

2
18.03.2021, 22:37

Лучше всего было бы, чтобы эмулятор терминала интерпретировал эти последовательности и приказал ему сбросить результат.

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

INPUT=file.txt OUTPUT=output.txt screen -Dmc /dev/null sh -c '
  screen -X scrollback 100000
  cat < "$INPUT"
  screen -X hardcopy -h "$OUTPUT"'
2
18.03.2021, 22:37

Теги

Похожие вопросы