Como justificar e centralizar o texto no bash?

5

Novato aqui. Eu estou procurando script bash para centrar e justificar o texto. Meu script só funciona com uma linha de texto. Como você melhoraria isso?

#!/bin/bash
COLS=$(tput cols)
while true; do
    clear
    echo -n "Type text "
    read text
    echo
    echo "Menu"
    echo "1) Right justify  "
    echo "2) Center "
    echo "3) Exit "
    echo
    echo -n "Choose [1-3]: "
    read opt
    echo
    case $opt in
        1) printf "%*s\n" $COLS "$text"
           break
        ;;
        2) printf "%*s\n" $[$COLS/2] "$text"
           break
        ;;      
        3) break
        ;;
        *)
        echo "Error. Press [1-3]"
        break
        ;;
    esac
done
    
por Edward 11.10.2014 / 16:09

2 respostas

5

Como você descobriu, $COLUMNS é útil apenas em um shell -i interativo, então usamos columns="$(tput cols)" .

O único problema que tenho é com a linha abaixo. Não centraliza o texto.
printf "%*s\n" $[$COLS/2] "$text"

Expandindo seu trabalho, aqui está uma função para exibir o texto centralizado (de um arquivo). Para chamá-lo dentro do seu script, use display_center "file.txt"

display_center(){
    columns="$(tput cols)"
    while IFS= read -r line; do
        printf "%*s\n" $(( (${#line} + columns) / 2)) "$line"
    done < "$1"
}

Observe o uso de ${#line} (semelhante a wc -m ) para contar o número de caracteres na linha. Contanto que você só precise exibir texto simples sem cores / formatação, isso deve funcionar bem.

Aqui está uma função para exibir texto justificado à direita (de um arquivo) usando sua mesma implementação de printf.

display_right(){
    columns="$(tput cols)"
    while IFS= read -r line; do
        printf "%*s\n" $columns "$line"
    done < "$1"
}

Você também pode fazer coisas semelhantes com tput e echo, mas o exemplo abaixo não é tão robusto (ou seja, falhará com strings longas).

row=0
col=$(( ($(tput cols) - ${#text}) / 2))
tput clear
tput cup $row $col
echo "$text"

Além disso, você pode considerar usar dialog ou select para gerar seu menu. Isso tornaria seu script significativamente mais limpo.
link
link

    
por 22.10.2014 / 07:05
3
#!/usr/bin/awk -f
{
  z = 92 - length
  y = int(z / 2)
  x = z - y
  printf "%*s%s%*s\n", x, "", $0, y, ""
}

Entrada

hello world
alpha bravo charlie delta

Saída

                                         hello world
                                  alpha bravo charlie delta
    
por 17.05.2015 / 18:15