GNU/Linux >> Belajar Linux >  >> Linux

Bash Script Ke Pusat Keberuntungan/teks Dari Stdin/pipa?

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 larik message 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 untuk awk untuk menghasilkan margin kiri sebagai string spasi yang dimasukkan ke dalam variabel margin .
    • baris awk pertama dijalankan untuk setiap baris input. Ini menghitung max_len , panjang baris input terpanjang (dibatasi menjadi width )
    • baris awk kedua dijalankan ketika semua baris input telah diproses. Ini mencetak string (width - max_len) / 2 karakter spasi
  • perintah terakhir mencetak setiap baris message setelah menambahkan margin 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.

Terkait:Skrip Bash untuk Mengurutkan File ke Folder Abjad di ReadyNAS Duo v1?

Tes:

$ fortune | center.sh  60
     Tuesday is the Wednesday of the rest of your life.
     ──────────────────────────────────────────────────

Linux
  1. Mencegah skrip bash berjalan secara bersamaan

  2. Lewati Argumen Baris Perintah ke Skrip Bash?

  3. Bash Script:Periksa Apakah File Adalah File Teks?

  1. Ubah Surat Masuk Dari Teks/biasa Menjadi Teks/html?

  2. Bagaimana Cara Mengatur Parameter Saat Pipa Bash Script Ke Bash?

  3. Jalankan skrip bash dari URL

  1. skrip bash menambahkan teks ke baris pertama file

  2. matlab mengeksekusi skrip dari baris perintah linux

  3. Bunuh program setelah mengeluarkan baris tertentu, dari skrip shell