Používám malý skript v pythonu3 k zobrazení centrovaného bohatství v konzoli, můžete mi doporučit, jak to udělat v čistém bash?
soubor: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)
Poté v .bashrc
Po vytvoření spustitelného chmod +x ~/center.python3
:
fortune | ~/center.python3
UPRAVIT :Později se pokusím odpovědět na tento OP na základě komentáře, který jsem měl, ale zatím jsem to udělal gramotnější.
ÚPRAVA 2 :aktualizace skriptu python, aby se vyřešila chyba, na kterou upozornil @janos o rozšíření karet.
Přijatá odpověď:
Zde je můj skript 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}"
Jak to funguje:
- první příkaz vloží každý řádek
stdin
v polimessage
po převodu tabulek na mezery (díky @NominalAnimal) - druhý příkaz načte šířku okna z parametru #1 a vloží ji do proměnné
width
. Pokud není zadán žádný parametr, použije se skutečná šířka terminálu. - třetí příkaz odešle celou
message
naawk
za účelem vytvoření levého okraje jako řetězce mezer, který je vložen do proměnnémargin
.- pro každý vstupní řádek se provede první řádek awk. Vypočítá
max_len
, délka nejdelšího vstupního řádku (omezená nawidth
) - druhý řádek awk se provede po zpracování všech vstupních řádků. Vypíše řetězec
(width - max_len) / 2
prázdné znaky
- pro každý vstupní řádek se provede první řádek awk. Vypočítá
- poslední příkaz vytiskne každý řádek
message
po přidánímargin
jim
Test:
$ 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
Nakonec, pokud chcete ukončit zobrazení oddělovací čárou, jako ve vašem skriptu Python, přidejte tento řádek před poslední printf
příkaz:
message+=( $(IFS=''; sed s/./─/g <<< "${message[*]}" | sort | tail -n1)$'\n' )
To, co dělá, je nahradit každý znak v každém řádku ─
, vyberte nejdelší pomocí sort | tail -n1
a přidejte jej na konec zprávy.
Test:
$ fortune | center.sh 60
Tuesday is the Wednesday of the rest of your life.
──────────────────────────────────────────────────