Por que expandir usa diferentes quantidades de caracteres de espaço?

0

Por que o comando expandir não converte cada caractere de tabulação em exatamente 8 caracteres de espaço?

Por exemplo: this^Iis^Itabs ( ^I representa um caractere de tabulação)

Torna-se: this____is______tabs____ (sublinhados adicionados para mostrar espaços)

Em vez de: this________is________tabs________

Do meu teste, parece que o expand leva todos os caracteres em um limite de palavra antes do caractere de tabulação e, em seguida, converte a tab em quantos espaços ele precisar para somar um total de 8 caracteres (incluindo os caracteres dentro dele) limite de palavras).

Por que isso acontece?

A página man não me dá dicas para esse comportamento.

    
por Jeff Reeves 28.02.2018 / 21:07

3 respostas

3

A utilidade expand expande os caracteres da guia para a próxima parada de tabulação implícita. Historicamente e, portanto, por padrão, eles são a cada oito caracteres, mas você pode alterá-los com a opção -t .

printf "%s\t%s\t%s\n" 12345 1234 123
12345   1234    123

printf "%s\t%s\t%s\n" 12345 1234 123 | expand
12345   1234    123

printf "%s\t%s\t%s\n" 12345 1234 123 | expand -t 10
12345     1234      123

printf "%s\t%s\t%s\n" 12345 1234 123 | expand -t 10,16
12345     1234  123

Se você realmente quer apenas substituir a aba com oito espaços, você pode usar sed :

printf "%s\t%s\t%s\n" 12345 1234 123 | sed 's/\t/        /g'
    
por 28.02.2018 / 21:18
1

Essa é exatamente a idéia de uma guia, ela salta para a próxima coluna, um ponto que não muda com a largura do campo anterior. Por exemplo, as guias aqui fazem a segunda coluna alinhar bem:

$ echo $'123\tfoobar\n123456\tblahblah'
123     foobar
123456  blahblah

Com o mesmo número de espaços nas duas linhas, o resultado seria feio:

123        foobar
123456        blahblah

Com paradas de tabulação de 8 caracteres isso obviamente só funciona se os valores forem de 0 a 7 (ou 8 a 15 etc) caracteres de largura, a variação sobre o limite de 8 caracteres novamente resulta em um resultado feio:

$ echo $'123\tfoobar\n123.345e6\tblahblah'
123     foobar
123.345e6       blahblah

Então, isso exigiria a configuração das paradas de tabulação para algo diferente:

$ echo $'123\tfoobar\n123.345e6\tblahblah' | expand -t 12
123         foobar
123.345e6   blahblah

Em vez de usar guias, a outra maneira de gerar resultados como esse seria usar printf com campos de largura fixa (isso é essencialmente semelhante à saída de expand ):

$ printf "%-11 %s\n" 123 foobar 123.345e6 blahblah
123          foobar
123.345e6    blahblah
    
por 28.02.2018 / 22:05
0

A página de manual do expand faz indicar que o espaçamento de tabulação padrão é oito caracteres:

-t, --tabs=NUMBER

have tabs NUMBER characters apart, not 8

A página de informações (que o projeto GNU prefere a man pages) similarmente estados

The default action is equivalent to -t 8 (set tabs every 8 columns).

mas é mais explícito que as guias são todas as x colunas no terminal, não uma inserção de x caracteres de espaço . Como observado em um comentário, as guias eram anteriormente clipes físicos anexados à máquina de escrever em desvios específicos para permitir o avanço para uma coluna específica, para formatação colunar.

    
por 28.02.2018 / 21:18