Aqui está meu script center.sh
:
#!/bin/bash
readarray message < <(expand)
width="${1:-$(tput cols)}"
margin=$(awk -v "width=$width" '
{ max_len = length > width ? width : length > max_len ? length : max_len }
END { printf "%" int((width - max_len + 1) / 2) "s", "" }
' <<< "${message[@]}")
printf "%s" "${message[@]/#/$margin}"
Como funciona:
- o primeiro comando coloca cada linha de
stdin
na matrizmessage
depois de converter tabulações em espaços (graças a @NominalAnimal) - o segundo comando lê a largura da janela do parâmetro # 1 e a coloca na variável
width
. Se nenhum parâmetro for dado, a largura real do terminal é usada. - o terceiro comando envia todo o
message
paraawk
para produzir a margem esquerda como uma sequência de espaços que é colocada na variávelmargin
.- a primeira linha do awk é executada para cada linha de entrada. Calcula
max_len
, o comprimento da linha de entrada mais longa (limitada awidth
) - a segunda linha do awk é executada quando todas as linhas de entrada foram processadas. Imprime uma string de
(width - max_len) / 2
caracteres de espaço em branco
- a primeira linha do awk é executada para cada linha de entrada. Calcula
- o último comando imprime todas as linhas de
message
depois de incluirmargin
nelas
Teste:
$ fortune | cowthink | center.sh
_______________________________________
( English literature's performing flea. )
( )
( -- Sean O'Casey on P. G. Wodehouse )
---------------------------------------
o ^__^
o (oo)\_______
(__)\ )\/\
||----w |
|| ||
$ echo $'|\tTAB\t|' | center.sh 20
| TAB |
$ echo "A line exceeding the maximum width" | center.sh 10
A line exceeding the maximum width
Finalmente, se você quiser terminar a exibição com uma linha de separação, como em seu script Python, adicione essa linha antes do último comando printf
:
message+=( $(IFS=''; sed s/./─/g <<< "${message[*]}" | sort | tail -n1)$'\n' )
O que ele faz é substituir todos os caracteres em todas as linhas por ─
, selecionar o mais longo com sort | tail -n1
e adicioná-lo ao final da mensagem.
Teste:
$ fortune | center.sh 60
Tuesday is the Wednesday of the rest of your life.
──────────────────────────────────────────────────