GNU/Linux >> Znalost Linux >  >> Linux

Bash skript do centra Fortune/textu ze Stdin/pipe?

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 poli message 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 na awk 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á na width )
    • druhý řádek awk se provede po zpracování všech vstupních řádků. Vypíše řetězec (width - max_len) / 2 prázdné znaky
  • 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.

Související:Bash Script pro řazení souborů do abecedních složek na ReadyNAS Duo v1?

Test:

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

Linux
  1. Předat argumenty příkazového řádku skriptu Bash?

  2. Bash skript k odstranění nejstaršího souboru ze složky?

  3. Upravit příchozí poštu z textu/prostého na text/html?

  1. Jak nastavit parametry, když Pipe Bash Script to Bash?

  2. Podmíněně zahrnout fázi potrubí do skriptu Bash?

  3. Potrubí do/ze schránky ve skriptu Bash

  1. Spusťte bash skript z adresy URL

  2. bash skript připojí text k prvnímu řádku souboru

  3. Jak přenést text z příkazového řádku do schránky