Bash adiciona espaços à direita para justificar a string

20

Meu código atual fica assim x=${y:0:40}:, que limita o comprimento da string a 40 caracteres. No caso de a string ter menos de 40 caracteres, é possível preencher os locais à direita 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) "

user222977
fonte

Respostas:

20

Se esses caracteres são todos de byte único, ou seja, se você estiver em um código de idioma em que o conjunto de caracteres é de byte único (como iso8859-1) ou se o conjunto de caracteres do código de idioma é UTF-8, mas o texto é apenas ASCII, você pode :

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

Isso abrangerá truncamento e preenchimento.

Caso contrário, você sempre pode adicionar 40 espaços e usar sua ${y:0:40}abordagem.

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

zsh possui operadores dedicados para preenchimento esquerdo e direito:

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

(também faz truncamento). zsh's printfcontagens em caracteres em vez de bytes, por isso não teria bash' s problema acima. No entanto, observe que você precisa da zshversão 5.3 ou mais recente para a -vopção.

Consulte também esta resposta a uma pergunta relacionada para obter mais detalhes se você se deparar com caracteres que nem todos têm a mesma largura.

Stéphane Chazelas
fonte
14

Você deve tentar printf:

printf '%-40s' "$y"

fonte
10

Puro bash:

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

O método é adicionar de 0 a 40 espaços a cada cadeia de caracteres após truncá-la.

Saída (observe as posições de aspas simples):

'very short text                         '
agc
fonte
1
Prefiro usar esse método, porque ele funciona diretamente em variáveis ​​e não precisa ser gerado.
David Tabernero M.