a saída da “coluna” está desalinhada quando o texto está colorido [duplicado]

0

Eu tenho uma lista de sentenças em um script tcsh, que são separadas por '\ n' e podem ter espaços em branco no interior. Eu quero mostrá-los no estilo de ls, então eu fiz "echo $ list | column". funciona bem quando não há cor usada. o resultado é como abaixo

Emseguida,precisodestacaralgunsitensquesãoalterados(últimas3opções)acadavezqueaparecem.Euadicionoasseqüênciasdecores(\e[33me\e[0m)emtornodositensquequerodestacar,eaindaoscoloconalista$.Quandoeuosmostrarcom"echo $ list | column", a cor é ok, mas o texto está desalinhado como a imagem a seguir.

Note,eutenteiissosenãousar'|column',asstringsmostraramcorretamenteemumacoluna,mesmoquenãosejaoestiloqueeuquero.

Existealgumasoluçãoparaoproblema?

BTW,eufizalgumapesquisaepareceserumbugdacoluna.Existealgummantenedorparacoluna?Ondedevorelataroproblema?

NOTA:Li Emitir com o comando de coluna e códigos de escape de cor antes do post. Seu formato é fixo, enquanto meus itens de cor são dinâmicos. Então, basta usar printf ou adicionar cor após a coluna não pode trabalhar

    
por Alex C 06.03.2017 / 04:51

2 respostas

0

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:

    
por 06.03.2017 / 07:14
0

As sequências de colorização estão bagunçando a contagem de caracteres para column , então você pode adicionar cor após o passo de colunização, como em:

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"

Os itens específicos que você deseja que sejam coloridos são colocados na linha de comando na opção -C , mas você pode alterar qualquer nome, que então está disponível para Perl através da variável $ C. Como é uma lista de itens separada por espaço, divida-o em espaços e aplique o regex na linha atual. As barras invertidas no final das linhas são para o tcsh desde que você disse que é uma variável tcsh list na qual você estava operando.

Regex

Um breve trabalho do regex está em ordem e dado abaixo: Observe que, como a regex não está anexada a nenhuma variável, isso significa que ela é anexada à variável $ _, que é a linha atual em nosso caso.

/
   (?:             # 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;
    
por 06.03.2017 / 10:03