Como o comando unexpand realmente funciona?

3

Eu já li algumas explicações sobre o unexpand, mas ou eu não entendo, ou não está funcionando como esperado.

Vamos considerar o seguinte exemplo:

[root@hope log]# echo "A12345678B" | tr '[1-8]' ' ' | unexpand -a
A        B
[root@hope log]# echo "A12345678B" | tr '[1-8]' ' ' | unexpand -a | od -ta
0000000   A  ht  sp   B  nl
0000005
[root@hope log]# echo "A12345678B12345678C" | tr '[1-8]' ' ' | unexpand -a | od -ta
0000000   A  ht  sp   B  ht  sp  sp   C  nl
0000011
[root@hope log]# echo "12345678" | tr '[1-8]' ' ' | unexpand -a | od -ta
0000000  ht  nl
0000002

Vejo que ele substitui 8 espaços em branco por uma guia, mas acrescenta mais um espaço sempre que aparece algum caractere não em branco.

Usando bash-4.3.42-3.fc23.x86_64 e coreutils-8.24-6.fc23.x86_64

Por favor, você poderia explicar esse comportamento?

    
por sebelk 14.03.2016 / 22:53

1 resposta

7

O programa unexpand não substitui apenas 8 espaços por uma tabulação. Ele substitui espaços e tabulações na linha com a suposição de que uma guia faz com que o terminal usado para exibir a linha seja movido para a próxima tabstop . Normalmente, eles estão em intervalos de 8 espaços, mas, para a maioria dos terminais, o intervalo pode ser alterado (e o intervalo para cada parada pode ser alterado).

O primeiro exemplo de string "A12345678B" substitui os dígitos 1-8 por espaços. Os primeiros 8 caracteres no resultado são um intervalo de tabulação. Isso deixa um espaço (onde o 8 estava) na primeira parada de tabulação. O programa unexpand não adiciona um espaço; que sobra após unexpand substituir os espaços em 1-7 por uma tabulação.

Um usaria unexpand para converter um arquivo contendo principalmente espaços (ou uma mistura de espaços e tabulações) em um formato consistente usando guias. Um arquivo com muitas linhas que começam com espaços pode ser muito maior que um usando guias pelo mesmo motivo ( recuo ). Além disso, ele é usado para converter um arquivo para usar paradas de tabulação diferentes , por exemplo, para uma tabela cujas colunas se alinham com um conjunto de tabulações, tornando-a mais larga ou mais estreita.

Uma conversão entre intervalos de tabulação diferentes pode ser feita assim:

expand -t 1,6,11,16,21 foo | unexpand -t 1,9,17,25,33 >bar

Além das paradas de tabulação definidas no terminal , alguns programas (como vi ) podem exibir texto com intervalos de tabulação diferentes.

Leitura adicional

por 14.03.2016 / 23:13