As seqüências de escape que colorem a saída não são entendidas por column
, que opera simplesmente contando "caracteres imprimíveis" em sua entrada. Como exemplo, a sequência para transformar o texto em verde ( ^[[0;32m
) contém seis caracteres imprimíveis e contará como tal.
Se você quiser ver o que o column
realmente vê quando determina a largura da coluna, tente algo assim:
ls --color=always / | tr -dc '\n -~' | column -s '\n'
Substitua ls --color=always /
por qualquer comando que tenha saída colorida se o seu ls
não suportar essa opção.
Não há como convencer column
a ignorar essas seqüências de escape, mas você pode adicionar a cor posteriormente.
Digamos que você tenha um arquivo to-list
semelhante a este:
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
Então você faz:
list=$(cat to-list)
E suponha que você saiba que deseja colorir algumas entradas específicas:
to_color='bg3cda0 bg4dtva0f bg6ctz1f'
Você pode formatar a lista com column
antes de colorir:
printf '%s\n' "${list}" \
| column -s '\n' \
| sed "s@$( (printf '%s\|' ${to_color}; echo) \
| sed 's@^@\([0-9][0-9]*: \(@' \
| sed 's@\|$@\)\)@' \
)@$(printf '3')[33m$(printf '3')[0m@g"
Essas entradas podem ser geradas dinamicamente desde que você tenha alguma maneira de gerar essas duas variáveis ( ${list}
e ${to_color}
).
O resultado: