Как использовать столбец с введенными цветами?

Получите последний исходный код через apt-get source network-manager, получите соответствующие пакеты с помощью apt-get build-dep network-manager, затем соберите пакет самостоятельно с помощью dpkg-buildpackage. Затем вы можете установить файл.deb вручную.

2
07.12.2020, 13:35
2 ответа

Вы можете подключиться к cat -v, чтобы увидеть все символы этого файлового потока. columnвычисляет ширину, используя их:

^[[1mfoo^[(B^[[m ^[[1mbar^[(B^[[m
bar foo

Правильный способ — отделить любое создание контента от любого форматирования (, как в модели MVC ). Обратите внимание, что columnдобавляет пробелы для создания вкладки -, аналогичной выводу, поэтому он изменяет содержимое. В то время как tputдобавляет инструкции к терминалу. Разделив эти задачи, мы можем сохранить вывод в файл или передать его из нашей функции форматирования для отправки на консоль или отформатировать для другого назначения.


Но это также хорошее упражнение для awkдля реализации column -t, исключающей некоторые символы из вычислений ширины.Регулярное выражение, которое я использую ниже, улавливает много вещей tput, но я почти уверен, что не все.

$ cat tst.awk
BEGIN {
    OFS = "  "
}

{
    nr = NR
    for (i=1;i<=NF;i++) {
        f[NR,i] = $i
        gsub(/\x1B[^[:alpha:]]+[[:alpha:]]/,"",$i)
        if (length($i) > col[i]) col[i] = length($i)
    }
}

END {
    for (i=1;i<=nr;i++) {
        for (j=1;j<=length(col);j++) {
            printf "%-"col[j]"s%s", f[i,j], (j==length(col)? ORS : OFS)
        }
    }
}

и вы передаете первый вывод наawk -f tst.awk

1
18.03.2021, 22:45
$ {
    echo -e "$(tput bold)foo$(tput sgr0)" "$(tput bold)bar$(tput sgr0) baz";
    echo bar foo;
  } |cat -v
^[[1mfoo^[(B^[[m ^[[1mbar^[(B^[[m baz
bar foo

Проблема заключается в tput sgr0, который, как вы знаете, по умолчанию tputsиспользует escape-коды, основанные на типе терминала, взятом из переменной окружения TERM.

если да:

infocmp -1 |grep -E 'bold|sgr0'
    bold=\E[1m,
    sgr0=\E(B\E[m,

Вы увидите, что жирный и sgr0 коды являются (не являются -экранированными значениями ANSI ), которые, как вы видите в выводе после cat -vте преобразуется в ^[[1mдля tputs boldи ^[(B^[[mдля sgr0и columnкоманда делает то же самое и разрешается в коды escape-типа ANSI, но терпит неудачу, когда есть (Bи остается в ^[(B^[[m, а затем это не не распознается в escape-последовательности ANSI и приводит к тому, что окончательный вывод не соответствует ожидаемому столбцу -правильно.

если да:

infocmp -1 -T ansi |grep -E 'bold|sgr0'
        bold=\E[1m,
        sgr0=\E[0;10m,

вы найдете эквивалентные escape-коды ANSI для каждого; так что у вас есть два варианта решения:

  1. Замените tputsуправляющими кодами ANSI выше

    .
    { 
      echo -e "\033[1mfoo\033[0;10m" "\033[1mbar\033[0;10m baz";
      echo bar foo;
    } |column -t
    
  2. Передать Тип терминала наtputs:

    {
      echo -e "$(tput bold)foo$(tput -T ansi sgr0)" "$(tput bold)bar$(tput -T ansi sgr0) baz";
      echo bar foo;
    } |column -t
    
1
18.03.2021, 22:45

Теги

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