La formattazione del testo è un argomento interessante, soprattutto quando si tratta di bash. Sebbene ci siano molti strumenti per formattare il testo, printf è unico e universale. Scopri tutto su printf in Bash per formattare il tuo testo nel modo giusto!!
Usando printf in bash
C ++ e altri sviluppatori avranno già familiarità con printf come un ottimo modo per formattare l'output di testo durante la programmazione. Avere lo stesso strumento disponibile in Bash è di grande beneficio. printf ti consente di controllare e produrre formati di output complessi, proprio come desideri. La pagina man di printf stabilisce printf come uno strumento di "stampa e formattazione dei dati", che è esattamente quello che è e fa.
Come esempio, Vuoi stampare un numero decimale con una lunghezza esatta di 3 byte (i personaggi / numeri) per tutta la parte (la parte prima della virgola o della virgola, a seconda di dove vivi nel mondo e di quale sia la tua località) e 2 byte (i personaggi / numeri) per la parte decimale del numero? Nessun problema, printf può farlo e molto altro. Puoi anche inviare il testo a una colonna specifica sullo schermo, eccetera.
Anche se la sintassi di printf, per un nuovo sviluppatore, può sembrare confuso o complesso, in realtà è abbastanza semplice. Esiste solo un set limitato di caratteri in formato di lavoro comunemente usati che possono essere utilizzati all'interno di una definizione di output printf. Diamo un'occhiata a questi prima..
Sintassi: printf
Questi sono i più usati sintassi printf idiomi in formato numerico:
%d or %i a signed decimal integer %u an unsigned decimal integer %f a decimal floating point number %e a scientific notation number %g will let printf use %e or %f, whichever is shorter %c a single character %s a string of characters %% al valore letterale '%'
Prossimo, È bene sapere come specificare opzioni specifiche per il collegamento con questi modi di linguaggio di formattazione. Il formato per specificare le opzioni per questi è il seguente:
%[bandiera(S)][Larghezza][.Precisione][lunghezza]number_formatting_idiom
Esempi: printf
Quindi, come esempio, per avere un galleggiante con una larghezza di 3 e un'accuratezza di 2, deve specificare:
%3.2F
Vediamo un esempio:
printf "%3.2Fn" "100.304"
Semplice e semplice. Si noti che avremmo potuto utilizzare una variabile invece di "100.304"
:
VAR1=100.304
printf "%3.2Fn" ${VAR1 ·}
Si noti inoltre come aggiungiamo una nuova riga utilizzando un n
nuova sequenza di linee. Per un elenco completo delle sequenze interpretate disponibili, vedere man printf
. I più comuni sono n
per nuova linea, t
per scheda e per una barra rovesciata.
Nel formato delle alternative sopra abbiamo anche visto come possiamo specificare le bandiere. C'è un numero limitato di bandiere comuni:
- Testo giustificato a sinistra (right-justify è l'impostazione predefinita)
+ Forza l'uso di un segno, even if positive
' ' A space is inserted if no sign will be used
0 Inserire a sinistra il numero con zeri anziché spazi quando si specifica il riempimento
A) Sì, come esempio, possiamo avere:
VAR1=-100.304
VAR2=100.304
printf "% 3.2ftt%+3,2fn" ${VAR1 ·} ${VAR2 ·}
Qui usiamo due variabili e separiamo l'output con due tab usando due t
sequenze di tabulazioni. Inseriamo anche uno spazio (come una bandiera) Entra %
e definizione di larghezza. Ciò ha portato al numero negativo in VAR1
stampare con segno negativo. Se il numero fosse stato positivo, nessun segno sarebbe stato stampato e, Invece, uno spazio sarebbe stato stampato nella stessa posizione.
Per finire usiamo il +
bandiera e, in realtà, il nostro numero è rilasciato con a +
segno indipendentemente dal fatto che il numero sia già positivo e, perché, (regolarmente) nessun segno verrà stampato.
Quindi, Come possiamo assicurarci di avere zeri o spazi iniziali?, pur avendo una lunghezza specifica? Primo, dobbiamo assicurarci che la larghezza della nostra definizione sia più lunga del contenuto variabile, e in secondo luogo possiamo usare il 0
flag per mostrare gli zeri iniziali:
VAR1=-100.304
VAR2=100.304
printf "% 13.2fn3.2fn.2f" ${VAR1 ·} ${VAR2 ·} ${VAR1 ·}
In questo esempio, noi stampiamo 3 Linee, separati due volte dal n
nuova sequenza di linee. Notiamo subito che se non c'è una nuova riga alla fine dell'output, il nostro indicatore Bash ritorna specificamente alla fine della nostra terza linea di uscita.
Questo potrebbe non essere un formato carino o utile in modalità interattiva sul terminale, ma dall'interno di uno script (pensare, come esempio, in una sequenza come 1...2...3...
che viene costruito passo dopo passo sullo schermo mentre si scorre il codice) questo può essere molto utile.
Sulla seconda linea di partenza, noi usiamo il 0
flag per indicare che vorremmo utilizzare gli zeri iniziali per VAR2
. In realtà, l'output genera zeri iniziali, fino a impostare la lunghezza.
Sulla prima linea di partenza, inseriamo uno spazio mentre nella terza riga di output (sia la stampa del VAR1
variabile) noi non abbiamo fatto. L'output è lo stesso, che è l'unica stranezza che ho riscontrato mentre lavoravo printf
; ci si aspetterebbe che ci sia un carattere aggiuntivo dato il printf space flag definizione. Questo rimane lo stesso anche se usiamo gli zeri iniziali. Rimane lo stesso anche se la lunghezza non è specificata.
Perciò, l'usabilità della bandiera spaziale può essere limitata in alcuni casi (numeri negativi). Questo non è il caso dei numeri positivi:
VAR1=100.304
printf "% fnn" ${VAR1 ·} ${VAR1 ·}
In questa circostanza (numeri positivi), il bandiera spaziale funziona come previsto, e viene inserito uno spazio in più nel caso del primo VAR1
produzione.
conclusione
L'uso di printf dagli script bash o dalla riga di comando può produrre un output chiaro e consolidato. Se ridimensioni correttamente le variabili (e forse la gamma, controllali di sicuro), usando printf ti darà un metodo flessibile per formattare l'output (e il layout generale dello schermo per applicazioni più grandi) come scegli tu.
In questo post, discutiamo degli idiomi di formato numerico comunemente usati, come impostare la larghezza dell'intero e della parte decimale dei numeri?, e passiamo in rassegna le bandiere più utilizzate in printf. Divertiti a stampare dati ben formattati con printf!