вывод «столбца» смещен, когда текст окрашен [дубликат]

0
13.04.2017, 15:36
2 ответа

Управляющие последовательности, которые окрашивают вывод, не понимаются column, который работает, просто подсчитывая "печатаемые символы" в своем вводе. Например, последовательность для окрашивания текста в зеленый цвет (^[[0;32m) содержит шесть печатаемых символов и будет считаться таковой.

Если вы хотите посмотреть, что на самом деле видит column при определении ширины колонки, попробуйте сделать следующее:

ls --color=always / | tr -dc '\n -~' | column -s '\n'

Замените ls --color=always / любой командой с цветным выводом, если ваш ls не поддерживает эту опцию.

Нет способа убедить column игнорировать эти управляющие последовательности, но вы можете добавить цвет после них.

Допустим, у вас есть файл to-list, который выглядит так:

1: avifsc01
2: avifsh01_bg4dtva0f
3: avifsh01_bg5dtvz1f
4: bg2ctqz1
5: bg2dtva0
6: bg3cda0
7: bg3cda1
8: bg3cdpa0
9: bg3z1
10: bg4cdpa0f
11: bg4cdpz1f
12: bg4cdz1f
13: bg4cta0f
14: bg4ctpa0f
15: bg4ctpz1f
16: bg4ctz1f
17: bg4dtva0f
18: bg4dtvz1f
19: bg5ctpz1f
20: bg5ctz1f
21: bg5dtvz1f
22: bg6ctz1f
23: bgpk01
24: dsc
25: test
26: vpp01
27: vrdlib01

Затем вы делаете:

list=$(cat to-list)

И предположим, вы знаете, что хотите раскрасить несколько конкретных записей:

to_color='bg3cda0 bg4dtva0f bg6ctz1f'

Вы можете отформатировать список с помощью column перед тем, как раскрасить его:

printf '%s\n' "${list}"                         \
| column -s '\n'                                \
| sed "s@$( (printf '%s\\|' ${to_color}; echo)  \
            | sed 's@^@\\([0-9][0-9]*: \\(@'    \
            | sed 's@\\|$@\\)\\)@'              \
       )@$(printf '\033')[33m\1$(printf '\033')[0m@g"

Эти записи могут быть сгенерированы динамически, если у вас есть способ генерировать эти две переменные (${list} и ${to_color}).

The result:

colorized output

0
28.01.2020, 04:48

Последовательности раскрашивания портят количество символов для столбца , поэтому вы можете добавить цвет после этапа разбивки на столбцы, как в:

set items2color = ( "bg3cda0" "bg4dtva0f" "bg6ctz1f" )
echo "$list" | column |\
perl -slpe '\
   for my $c ( split /\s+/, $C ) {\
      s/(?:(?<=^)|(?<=\t))\d+:\s+\Q$c\E(?=\t|$)/\e[31m$&\e[0m/;\
   }\
' -- -C="$items2color"

Конкретные элементы, которые вы хотели раскрасить, помещаются в командную строку в параметре -C , однако вы можете изменить любое имя, которое затем станет доступным для Perl через переменную $ C. Поскольку это список элементов, разделенных пробелами, мы разбиваем его на пробелы и применяем регулярное выражение к текущей строке. Обратные косые черты в конце строк предназначены для tcsh , поскольку вы сказали, что это переменная списка tcsh , с которой вы работали.

Регулярное выражение

Краткая работа с регулярным выражением приведена ниже: Обратите внимание, что, поскольку регулярное выражение не привязано ни к какой переменной, это означает, что оно прикрепляется к переменной $ _, которая является текущая строка в нашем случае.

/
   (?:             # From where we are,
      (?<=^)       # we see the beginning of the current line to our left
         |         # OR
      (?<=\t)      # we see a TAB to our left
   )
          # We are the beginning of a digit

  \d+:    # followed by one or more digits, ending in a colon
  \s+     # then atleast one whitespace
  \Q$c\E  # followed by the item to be colored. \Q...\E quote the $c should
          # it comprise any characters which mean something to the regex.

 (?= \t | $ ) # we see a TAB or the end of line to our right
/x;
0
28.01.2020, 04:48

Теги

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