wc -L informa um comprimento de linha de 8 para um tab-char. bug ou recurso?

12

-L é um recurso útil de wc , ou foi o que pensei. Imprime o comprimento da linha mais longa. Por algum motivo, ele expande um caractere de tabulação de byte único para um comprimento de 8.
Existe alguma maneira de definir isso para não "expandir" a guia? e qual poderia ser a razão por trás dessa expansão?

echo -n $'\t' | wc -L

saídas de 8

wc (GNU coreutils) 7,4
GNU bash, versão 4.1.5

    
por Peter.O 12.09.2011 / 16:55

3 respostas

10

Não encontro nenhum relatório de bug relacionado a isso e as seguintes linhas no arquivo de origem wc.c

    case '\t':
        linepos += 8 - (linepos % 8);

parece deliberadamente optar por se comportar dessa maneira, provavelmente para dar uma dica de largura necessária para exibir o arquivo na tela.

Uma alternativa rápida poderia ser

echo -n $'\t' | tr '\t' ' ' | wc -L
    
por 12.09.2011 / 18:21
1

Normalmente, uma guia é expandida para a próxima posição, (divisível por 8) +1 [1, 9, 17, 25, ...] , portanto, se você pedir, você a obterá.

Note que o -n é irrelevante para a questão, mas o $ não é.

echo foo$'\t' | wc -L

retornará 8 também, porque

echo foo$'\t'bar 
foo     bar

Você pode omitir o $, se você usar -e para echo:

echo -e '\t' | wc -L
8

Então, se você quiser contar o '\ t' como um único byte, apenas omita -e e $:

echo '\t' | wc -L
2
    
por 12.09.2011 / 23:52
0

A descrição de wc-L era ambígua. Retorna a largura de exibição mais ampla. Para controlar a expansão da guia, você pode filtrar por expand primeiro.

    
por 09.06.2015 / 15:26