Acho que você está procurando expand
e / ou unexpand
. Parece que você está tentando garantir que uma largura de \t
ab seja contada como 8 caracteres em vez de um único. fold
fará isso também, mas irá envolver sua entrada na próxima linha em vez de truncá-la. Eu acho que você quer:
expand < input | cut -c -80
expand
e unexpand
são POSIX especificado :
- O utilitário
expand
deve gravar arquivos ou a entrada padrão na saída padrão com caracteres\t
ab substituídos por um ou mais caracteres espaço necessários para preencher a próxima parada da tabulação. Quaisquer caracteres backspace devem ser copiados para a saída e fazer com que a contagem de posição da coluna para cálculos de tabulação seja diminuída; a contagem da posição da coluna não deve ser decrementada abaixo de zero.
Muito simples. Então, aqui está uma olhada no que isso faz:
unset c i; set --;
until [ "$((i+=1))" -gt 10 ]; do set -- "$@" "$i" "$i"; done
for c in 'tr \t \ ' expand; do eval '
{ printf "%*s\t" "$@"; echo; } |
tee /dev/fd/2 |'"$c"'| {
tee /dev/fd/3 | wc -c >&2; } 3>&1 |
tee /dev/fd/2 | cut -c -80'
done
O loop until
no topo recebe um conjunto de dados como ...
1 1 2 2 3 3 ...
É printf
s com o sinalizador de preenchimento %*s
arg, portanto, para cada um deles no conjunto printf
será preenchido com tantos espaços quanto o número do argumento. Para cada um, ele acrescenta um caractere \t
ab.
Todos os tee
s são usados para mostrar os efeitos de cada filtro à medida que são aplicados.
E os efeitos são estes:
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
66
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8
105
Essas linhas estão alinhadas em dois conjuntos como ...
- saída de
printf ...; echo
- saída de
tr ...
ouexpand
- saída de
cut
- saída de
wc
As quatro primeiras linhas são os resultados do filtro tr
- em que cada \t
ab é convertido em um único espaço .
E a parte inferior quatro, os resultados da corrente expand
.