Quebra de texto para caracteres não imprimíveis

2

Esta questão pergunta sobre o envolvimento do texto em uma determinada coluna, e as pessoas sugerem o uso de fold ou fmt , mas até onde eu posso ver, eles simplesmente contam os caracteres e não permitem caracteres não imprimíveis. Por exemplo:

fold -w 20 -s <<<'seq 1 25'

como se poderia esperar, produz:

1 2 3 4 5 6 7 8 9 
10 11 12 13 14 15 
16 17 18 19 20 21 
22 23 24 25

mas:

fold -w 20 -s <<<^[[32m'seq 1 25'^[[m

(onde ^[ é o caractere de escape) intuitivamente deve produzir a mesma coisa em texto verde, mas produz:

1 2 3 4 5 6 7 
8 9 10 11 12 13 14 
15 16 17 18 19 20 
21 22 23 24 25

em texto verde.

Não consigo ver nenhum comutador que diga para considerar caracteres não imprimíveis e a abordagem PS1 sinalizar caracteres não imprimíveis parece não funcionar com fold ou fmt .

Existe algo (idealmente, algo padrão) que pode envolver o texto ao mesmo tempo em que considera caracteres não imprimíveis?

EDITAR:

O exemplo acima é realmente para simplificar e demonstrar o problema, mas posso ter simplificado demais. Para esclarecer o meu exemplo do mundo real, eu tenho o texto onde algumas palavras estão em cores (usando seqüências de escape ANSI) e eu gostaria que isso se encaixasse perfeitamente. Por exemplo:

Here is some example text that contains ^[[31mred^[[m and ^[[32mgreen^[[m words that I would like to wrap neatly.

onde ^[ é o caractere de escape.

Se eu quisesse que isso envolvesse 20 colunas, eu esperaria:

Here is some
example text that
contains red and
green words that
I would like to
wrap neatly.

(com "vermelho" e "verde" em cores), mas por causa dos códigos de escape ANSI, ele envolve:

Here is some
example text
that contains
red and
green words
that I would like
to wrap neatly.
    
por Richard Wiseman 14.02.2018 / 10:11

1 resposta

1

A sequência de escape ANSI está sendo interpretada pelo shell, não pela tubulação. Então você está realmente inserindo o texto ^[[32m junto com sua saída de sequência no seu comando fold. Se você quiser todo o texto em verde, pode tentar algo assim:

echo -e "\e[32m"$(seq 1 25 | fold -w 20 -s)"\e[m"

ou

echo -e "\e[32m"; seq -s ' '  1 25 | fold -w 20 -s; echo -e "\e[m"

Observe que estou usando o \e como o caractere de escape. Isso funciona diretamente em shells do bash para testes.

    
por 14.02.2018 / 10:35