Saya menggunakan skrip kecil di python3 untuk menunjukkan kekayaan terpusat di konsol, dapatkah Anda menyarankan saya bagaimana melakukan ini di bash murni?
file:center.python3
#!/usr/bin/env python3
import sys, os
linelist = list(sys.stdin)
# gets the biggest line
biggest_line_size = 0
for line in linelist:
line_lenght = len(line.expandtabs())
if line_lenght > biggest_line_size:
biggest_line_size = line_lenght
columns = int(os.popen('tput cols', 'r').read())
offset = biggest_line_size / 2
perfect_center = columns / 2
padsize = int(perfect_center - offset)
spacing = ' ' * padsize # space char
text = str()
for line in linelist:
text += (spacing + line)
divider = spacing + ('─' * int(biggest_line_size)) # unicode 0x2500
text += divider
print(text, end="\n"*2)
Kemudian di .bashrc
Setelah membuatnya dapat dieksekusi chmod +x ~/center.python3
:
fortune | ~/center.python3
EDIT :Nanti saya coba balas OP ini berdasarkan komentar yang saya punya, tapi untuk sekarang saya buat lebih melek.
EDIT 2 :memperbarui skrip python untuk memecahkan bug seperti yang ditunjukkan oleh @janos tentang perluasan tab.
Jawaban yang Diterima:
Ini skrip saya 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}"
Cara kerjanya:
- perintah pertama menempatkan setiap baris
stdin
dalam larikmessage
setelah mengubah tabulasi menjadi spasi (terima kasih kepada @NominalAnimal) - perintah kedua membaca lebar jendela dari parameter #1 dan memasukkannya ke dalam variabel
width
. Jika tidak ada parameter yang diberikan, lebar terminal sebenarnya yang digunakan. - perintah ketiga mengirimkan seluruh
message
untukawk
untuk menghasilkan margin kiri sebagai string spasi yang dimasukkan ke dalam variabelmargin
.- baris awk pertama dijalankan untuk setiap baris input. Ini menghitung
max_len
, panjang baris input terpanjang (dibatasi menjadiwidth
) - baris awk kedua dijalankan ketika semua baris input telah diproses. Ini mencetak string
(width - max_len) / 2
karakter spasi
- baris awk pertama dijalankan untuk setiap baris input. Ini menghitung
- perintah terakhir mencetak setiap baris
message
setelah menambahkanmargin
kepada mereka
Tes :
$ 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
Terakhir, jika Anda ingin mengakhiri tampilan dengan garis pemisah, seperti pada skrip Python Anda, tambahkan baris ini sebelum printf
terakhir perintah:
message+=( $(IFS=''; sed s/./─/g <<< "${message[*]}" | sort | tail -n1)$'\n' )
Apa yang dilakukannya adalah mengganti setiap karakter di setiap baris dengan ─
, pilih yang terpanjang dengan sort | tail -n1
, dan tambahkan di akhir pesan.
Tes:
$ fortune | center.sh 60
Tuesday is the Wednesday of the rest of your life.
──────────────────────────────────────────────────