Bash adiciona espaços à direita para justificar a string

10

Meu código atual se parece com isto: x=${y:0:40} , que limita o comprimento da string a 40 caracteres. No caso de string com menos de 40 caracteres, é possível preencher os espaços com espaços?

Então, se meu y="very short text"

Eu gostaria que meu y fosse:

y="texto muito curto (+ 25 espaços à direita) "

    
por user222977 27.03.2017 / 13:45

3 respostas

12

Se esses caracteres forem todos de byte único, isto é, se você estiver em um local onde o conjunto de caracteres é de byte único (como iso8859-1) ou se o conjunto de caracteres do locale for UTF-8, mas o texto for somente ASCII, você pode fazer:

printf -v y %-40.40s "$y"

Isso cobrirá tanto o truncamento quanto o preenchimento.

Se não, você sempre pode adicionar 40 espaços e usar sua abordagem ${y:0:40} .

printf -v pad %40s
y=$y$pad
y=${y:0:40}

zsh tem operadores dedicados para preenchimento à esquerda e à direita:

y=${(r:40:)y}

(também faz truncamento). zsh printf conta em caracteres em vez de bytes, por isso não teria o problema de bash acima. No entanto, observe que você precisa de zsh 5.3 ou mais recente para a opção -v .

Veja também esta resposta a uma questão relacionada para obter mais detalhes se você se deparar com caracteres que não têm a mesma largura.

    
por 27.03.2017 / 13:58
9

Você deve tentar printf :

printf '%-40s' "$y"
    
por 27.03.2017 / 13:54
4

% purobash:

ten="          " 
forty="$ten$ten$ten$ten" 
y="very short text"
y="${y:0:40}${forty:0:$((40 - ${#y}))}"
echo "'${y}'"

O método é adicionar 0-40 espaços a cada string depois de truncá-la.

Output, (note as posições de aspas simples):

'very short text                         '
    
por 29.03.2017 / 07:52

Tags