dobrar e colunas de texto

3

Pode fold ser definido para reconhecer caracteres em vez de bytes? Caracteres chineses tradicionais parecem ser codificados em três bytes cada (em pelo menos UTF-8), o que significa que se fold -w não for um múltiplo de três, ocorrerá o seguinte:

$ cat in.txt
【財經中心、政治中心╱台北報導】看不慣政府施政效率緩慢,鴻海集團董事長郭台銘動念選總統!《壹週刊》報導,在川普勝選當晚,郭召集鴻海高層幹部,進行美國總統大選換人後的應變策略演練,讓人驚訝的是,郭詢問在場幹

$ cat in.txt | fold # -w is 80 by default
【財經中心、政治中心╱台北報導】看不慣政府施政效率緩��
�,鴻海集團董事長郭台銘動念選總統!《壹週刊》報導,在�
��普勝選當晚,郭召集鴻海高層幹部,進行美國總統大選換人
後的應變策略演練,讓人驚訝的是,郭詢問在場幹
A saída padrão de

fold é uma largura de 80 colunas, e isso resulta em 26 caracteres 2/3 ( 26 * 3 + 2 , ou 80 bytes) sendo impressos em cada linha. Portanto, -w deve ser definido para um múltiplo de três para evitar a quebra de caracteres. Então, pelo menos para fold , columns=bytes . Mais uma vez, a minha pergunta é, pode fold pode ser definido para honrar caracteres multi-byte? A página man não menciona nada sobre isso.

    
por Randy Josleyn 17.11.2016 / 08:29

2 respostas

3

GNU fold e GNU fmt só entendem bytes, não caracteres. Para envolver um certo número de caracteres, você pode usar sed.

sed 's/.\{20\}/&\n/g' <in.txt
【財經中心、政治中心╱台北報導】看不慣政
府施政效率緩慢,鴻海集團董事長郭台銘動念
選總統!《壹週刊》報導,在川普勝選當晚,
郭召集鴻海高層幹部,進行美國總統大選換人
後的應變策略演練,讓人驚訝的是,郭詢問在
場幹

Se você quisesse quebrar no espaço em branco (útil para vários idiomas), aqui está um script awk rápido e sujo.

awk '
    BEGIN {width = 20}
    NF == 0 {column = 0; print}
    {
        split($0, a);
        for (i in a) {
            w = length(a[i]) + 1;
            column += w;
            if (column > width) {column = w; print ""};
            if (column != w) printf " ";
            printf "%s", a[i];
        }
    }
    END {if (column) print ""}'

Em qualquer caso, certifique-se de que suas configurações de localidade estejam corretas. Especificamente, LC_CTYPE deve designar a codificação de caracteres correta, por exemplo, LC_CTYPE=en_US.utf8 ou LC_CTYPE=zh_CN.utf8 (qualquer código de idioma disponível no seu sistema serve) para Unicode codificado como UTF-8.

Observe que isso conta caracteres, não a largura da tela. Até mesmo fontes de largura fixa podem ter caracteres de largura dupla e isso geralmente é feito para caracteres chineses, por exemplo, uma largura de caractere de 20 para o texto acima ocupa 40 colunas em terminais típicos.

    
por 18.11.2016 / 01:53
3

Se você tiver o vim em seu sistema (que pode manipular caracteres UTF-8), tente isso:

insira esses comandos do modo ex do vim em um arquivo chamado fold.vim

set formatoptions+=m
" uncomment and update the line below to set line width to e.g. 60 chars
" textwidth=60
normal! gqG<Esc>
wq

se você tiver seus caracteres chineses em um arquivo chamado chinese_chars , poderá executá-lo a partir do seu prompt.

vim -e chinese_chars < fold.vim

onde vim -e significa iniciar o vim no modo "ex" e ler os comandos ex do STDIN

explicação do vimscript

de :h fo-table

m Also break at a multi-byte character above 255. This is useful for Asian text where every character is a word on its own.

Então, o que isso significa?

por padrão, o comando gq não funcionará em caracteres cujo número decimal esteja acima de 255. este caractere: tem um valor decimal de 22.577.
Executar set formatoptions+=m significa que a quebra funcionará com o texto em chinese_chars .

consulte: link

Para mim, isso edita o arquivo chinese_chars no local e quebra as linhas em 79 ou 80 caracteres - o padrão para o comando gq normal mode.

    
por 17.11.2016 / 09:35