BASH particolare formattazione

Postate qui per tutte le discussioni legate a Linux in generale.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Gnu/Linux in genere, se l'argomento è specifico alla Slackware usate uno dei forum Slackware o Slackware64.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
joe
Iper Master
Iper Master
Messaggi: 3986
Iscritto il: ven 27 apr 2007, 11:21
Slackware: 15.0
Kernel: 5.15.38
Desktop: dwm

BASH particolare formattazione

Messaggio da joe »

Vorrei rendere a video un messaggio che mostra i valori di tre variabili: l'output dovrebbe essere semplicemente

Codice: Seleziona tutto

VAR_a1 VAR_a2 VAR_a3
VAR_b1 VAR_b2 VAR_b3
....
VAR_*1 è semplicemente un numero di riga 1 2 3 ecc var_*2 è una stringa corta di 4 caratteri.
Invece il problema è che var_*3 è una stringa di caratteri piuttosto lunga e sul terminale mi sta anche su 4 righe: rappresenta un "url" che voglio visualizzare all'utente.

Per ottenere un output un po' più ordinato avevo pensato ad una soluzione che portasse ad un output del tipo:

Codice: Seleziona tutto

1 aaaa  blablablabalblablablab
         blblblblblblblblaldsn
         lkndla
2 bbbb  vclaksnvsalvknlsvknsva
         laskvnlknsavlasknsvlv
         sldvknasvlkasnvsvsal
3 ....
Ma come ottenere un formato del genere?
Attualmente visulizzo le 3 variabili a video con un semplice "echo" che però spalma la variabile numero 3 su più righe in una forma poco ordinata.
Usando echo var1 var2 var3 ottengo qualcosa come:

Codice: Seleziona tutto

1  aaa  lkascnlcknslcnclskcn
lskcjnlsjcnclsdcnlkssk kscjs
lkjsncjn
2  bbb  oeiwoiewjrwoirjowifj
woifowiefowiefoweifowifeoeif
sjvnvlsjnvdiwelsjfafpqfnlkfa
3  ....
Avete idee su come rendere l'output del tipo di quello precedente?

albatrosla
Packager
Packager
Messaggi: 1339
Iscritto il: sab 27 mar 2004, 0:00
Slackware: current
Desktop: fluxbox.git
Località: Collegno, but made in Friûl
Contatta:

Re: BASH particolare formattazione

Messaggio da albatrosla »

Dunque, ti conviene usare dei "tab" per allineare tutto correttamente e spezzare l'output di echo a intervalli predefiniti. Facciamo un esempio:

Codice: Seleziona tutto

a=var1
b=var2
c=1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_17_18_19_20_21_22_23_24_25_26_27_28_29_30
Se dai il comando echo "$a[TAB]$b[TAB]$c" ([TAB] va inserito, da terminale, con ctrl+v e dunque premendo il tasto TAB) ottieni:

Codice: Seleziona tutto

var1[TAB]var2[TAB]1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_17_18_19_20_21_22_23_24_25_26_27_28_29_30
Ora, puoi spezzarlo con sed, inserendo ogni "tot" caratteri un carriage return, seguito da due spazi di tabulazione in modo da allineare tutto all'inizio della terza variabile. Ad esempio, spezzando ogni 15 caratteri:

Codice: Seleziona tutto

echo "$a[TAB]$b[TAB]$c"|sed 's/\(.\{15\}\)/\1\n\t\t/g'    
var1[TAB]var2[TAB]1_2_3_4_5_6
[TAB][TAB]_7_8_9_10_11_12
[TAB][TAB]_13_14_15_16_17
[TAB][TAB]_18_19_20_21_22
[TAB][TAB]_23_24_25_26_27
[TAB][TAB]_28_29_30
La sintassi di sed consiste nel sostituire (s) ricorsivamente (g) su ogni riga generici campi (\(\)) costituiti da 15 (\{15\}) caratteri qualsiasi (.) con i campi stessi (\1) seguiti da un carriage return (\n) e due TAB (\t\t).
Contando la lunghezza dei primi due campi, si può pensare di concatenare due operazioni di sed in modo da ottenere la prima riga lunga effettivamente quanto le successive (ovviamente esclusa l'ultima...).

Rispondi