Você poderia contornar isso dizendo ao terminal para mover o cursor para a posição desejada, em vez de ter printf
count os caracteres.
$ printf "%s3[10G-\n" "abc" "├─cd" "└──ef"
abc -
├─cd -
└──ef -
Bem, supondo que você esteja imprimindo em um terminal, isso é ...
A sequência de controle existe <ESC>[nnG
, onde nn
é a coluna para onde mover, em decimal.
É claro que, se a primeira coluna for maior que o espaço alocado, o resultado não será muito bom:
$ printf "%s3[10G-\n" "abcdefghijkl"
abcdefghi-kl
Para contornar isso, você pode limpar explicitamente o restante da linha ( <ESC>[K
) antes de imprimir a coluna a seguir.
$ printf "%s3[10G3[K-\n" "abcdefghijkl"
abcdefghi-
Outra maneira seria fazer o preenchimento manualmente, assumindo que temos algo que pode determinar o comprimento da string em caracteres. Isso parece funcionar no Bash para personagens simples, mas é claro que é um pouco feio. Caracteres de largura zero e dupla provavelmente irão quebrá-lo, e eu não testei a combinação de caracteres.
#!/bin/bash
pad() {
# parameters:
# 1: name of variable to pad
# 2: length to pad to
local string=${!1}
local len=${#string}
printf -v "$1" "%s%$(($2 - len))s" "$string" ""
}
echo "1234567890"
for x in "abc" "├─cd" "└──ef" ; do
pad x 9
printf "%s-\n" "$x"
done
E a saída é:
1234567890
abc -
├─cd -
└──ef -