Предположение: вы пытаетесь это через трубу.
ПРИМЕЧАНИЕ. cal
печатает коды цветов только для tty
.
Во-первых, если вы собираетесь заменить то, что cal
отправляет через канал, то вам нужно проверить, что cal
отправляет в этот канал.
$ cal | od -t x1z -w$((($COLUMNS-12)/4))
0000000 20 20 20 20 20 4a 75 6c 69 20 32 30 31 35 20 20 20 20 > Juli 2015 <
0000022 20 20 20 20 0a 73 c3 b6 20 6d c3 a5 20 74 69 20 6f 6e > .s.. m.. ti on<
0000044 20 74 6f 20 66 72 20 6c c3 b6 20 20 0a 20 20 20 20 20 > to fr l.. . <
0000066 20 20 20 20 20 31 20 20 32 20 20 33 20 20 34 20 20 0a > 1 2 3 4 .<
0000110 20 35 20 5f 08 20 5f 08 36 20 20 37 20 20 38 20 20 39 > 5 _. _.6 7 8 9<
0000132 20 31 30 20 31 31 20 20 0a 31 32 20 31 33 20 31 34 20 > 10 11 .12 13 14 <
0000154 31 35 20 31 36 20 31 37 20 31 38 20 20 0a 31 39 20 32 >15 16 17 18 .19 2<
0000176 30 20 32 31 20 32 32 20 32 33 20 32 34 20 32 35 20 20 >0 21 22 23 24 25 <
0000220 0a 32 36 20 32 37 20 32 38 20 32 39 20 33 30 20 33 31 >.26 27 28 29 30 31<
0000242 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 > . <
0000264 20 20 20 20 20 20 20 20 20 20 0a > .<
0000277
Проверяя шестнадцатеричные коды (из od -t x1
) выше, вы видите последовательность
35 20 5f 08 20 5f 08 36 20 20 37
где 35
(первые два символа) совпадают с 5
а последние 37
совпадают с 7
в фактическом выходе (и в дампе ascii справа).
Непосредственно перед 37
вас есть пара из 20
(пробелов), и есть 36
которая из 6
.
Теперь только слева от 36
вы видите, что вам нужно заменить: 5f 08 20 5f 08
$ cal | sed -re 's/\x5f\x08\x20\x5f\x086/<strong>6<\/strong>/'
Juli 2015
sö må ti on to fr lö
1 2 3 4
5 <strong>6</strong> 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Вот и ты.
Я оставлю задачу сделать это общее для вас.
Дополнительный совет, проверьте man 5 terminfo
чтобы попробовать что-то с tput
- это максимально адаптируется к типу терминала под рукой во время выполнения.
Таким образом, tput setb 6
установит цвет фона 6, если терминал способен на это. И так же tput sgr0
сбросит все настройки цвета на "нормальный".
И если вы передадите вывод tput, например, в od -t x1z
вы увидите, что это за вывод.
Конечный результат: гораздо более переносимый скрипт, чем использующий echo -e ...