Управляющие последовательности, которые окрашивают вывод, не понимаются 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:
Последовательности раскрашивания портят количество символов для столбца
, поэтому вы можете добавить цвет
после этапа разбивки на столбцы, как в:
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;