Comando fmt in Linux: riformattare paragrafi e regolare la larghezza
Il comando fmt ridistribuisce le parole dei paragrafi di testo semplice su nuove righe: può unire righe brevi e dividere quelle lunghe senza spezzare le parole. Scrive il risultato sull'uscita standard e non modifica direttamente il file letto. È utile per riordinare appunti e bozze con interruzioni di riga irregolari.
Usalo per la prosa, dopo aver controllato un campione. Codice sorgente, CSV (valori separati da virgole), tabelle Markdown e registri in cui ogni riga rappresenta un evento hanno una struttura che fmt non interpreta: ridistribuirne le parole può renderli inutilizzabili.
Sintassi e comportamento di base
fmt [opzione...] [file...]
Questa è una notazione: sostituisci i segnaposto con opzioni e nomi reali. Senza file, oppure passando -, fmt legge l'ingresso standard. Controlla fmt --version, fmt --help e man fmt nell'ambiente di destinazione: implementazioni e opzioni disponibili possono differire.
In GNU fmt la larghezza predefinita è 75 colonne; la larghezza obiettivo usata per distribuire il testo è normalmente il 93% di quella impostata. Non aspettarti quindi che tutte le righe arrivino all'ultima colonna. Gli esempi seguenti usano testo ASCII e file con terminazioni LF; sono stati verificati con GNU fmt 8.32 nel Bash di Git per Windows.
Preparare i file e riformattare un paragrafo
Esegui tutto questo blocco nel Bash, da una cartella in cui puoi creare file. Il comando mktemp prepara una nuova sottocartella, così gli esempi non usano documenti già presenti. Le parentesi eseguono il lavoro in una subshell; alla fine la sessione rimane nella cartella iniziale. In questo blocco lineare set -eu interrompe l'esecuzione in caso di errori non gestiti o variabili non definite.
(
set -eu
labdir=$(mktemp -d ./fmt-demo.XXXXXX)
cd "$labdir"
printf 'one two\nthree four\n\nfive six\nseven eight\n' > notes.txt
printf 'alpha beta gamma delta epsilon zeta eta theta iota kappa lambda mu nu xi omicron pi rho sigma tau upsilon phi chi psi omega.\n' > draft.txt
fmt notes.txt
printf 'Cartella di prova: %s\n' "$PWD"
)
fmt notes.txt produce una riga con one two three four, una riga vuota e una riga con five six seven eight. La riga vuota separa i due paragrafi e impedisce che siano riuniti. Le parole inglesi servono solo come dati di prova.
L'ultima riga mostra il percorso completo della cartella di prova. Per i comandi successivi entra in quella cartella con cd, racchiudendo il percorso tra virgolette. Conserva notes.txt e draft.txt per confrontare gli originali con i risultati.
Impostare la larghezza e salvare il risultato
Nella cartella di prova, il comando seguente ridistribuisce le parole di draft.txt con larghezza 60:
fmt -w 60 draft.txt
Il testo viene suddiviso in più righe; nel campione preparato nessuna supera 60 caratteri ASCII. Confrontalo con fmt -w 72 draft.txt, senza cambiare il file di ingresso. La posizione delle interruzioni cambia, mentre le parole restano nello stesso ordine. La larghezza non è un taglio rigido: una singola parola più lunga del limite può superarlo.
Per salvare l'uscita a larghezza 72, esegui una volta questo blocco nella stessa cartella. L'opzione C di set -euC attiva la protezione del Bash contro la sovrascrittura tramite questo redirezionamento di un file regolare esistente:
(
set -euC
fmt -w 72 draft.txt > draft-formatted.txt
)
Leggi il file con cat draft-formatted.txt e confrontalo con diff -u draft.txt draft-formatted.txt. Le differenze nelle interruzioni di riga sono previste: lo stato 1 di diff indica differenze, non necessariamente un errore di fmt. Verifica anche che parole e separazione dei paragrafi siano corrette.
Se il file di destinazione esiste già, controllalo e scegli un altro nome. Non usare mai lo stesso file come ingresso e destinazione del redirezionamento: la shell può svuotarlo prima che fmt inizi a leggerlo. Per annullare l'effetto di questa prova basta tornare all'originale conservato; non occorre sostituirlo con il file riformattato.
Capire l'esempio con larghezza 20
Questo esempio non richiede file e mostra come vengono distribuite sei parole:
printf 'one two three four five six\n' | fmt -w 20
Con GNU fmt 8.32 l'uscita verificata è:
one two three four
five six
La prima riga contiene 18 caratteri ASCII e la seconda 8, esclusa l'interruzione finale. Fmt sceglie i punti di interruzione tra le parole, anziché riempire ogni riga fino a 20 caratteri. La disposizione può cambiare con l'implementazione o le opzioni.
Per osservare il limite delle parole lunghe, esegui printf 'abcdefghijklmnopqrstuvwxy\n' | fmt -w 10: i 25 caratteri rimangono sulla stessa riga nella versione verificata. Se invece vuoi ripiegare ciascuna riga senza unire le righe brevi, considera il comando fold. Fold può anche spezzare una parola; scegli lo strumento in base alla necessità di preservare parole intere o imporre interruzioni sulle singole righe.
Scegliere -s, -u e -p e controllare la struttura
-s divide le righe lunghe senza unire quelle brevi. Confronta printf 'one two\nthree four\n' | fmt -w 20, che produce una sola riga, con printf 'one two\nthree four\n' | fmt -s -w 20, che conserva due righe. Non è comunque un'opzione per analizzare codice o tabelle.
-u uniforma la spaziatura: uno spazio tra parole e due dopo le frasi riconosciute dal programma. Prova printf 'One\040\040\040\040word.\040\040\040Next\040\040\040sentence.\n' | fmt -u -w 40. Ogni sequenza \040 rappresenta uno spazio in ingresso. L'uscita contiene One word., due spazi e Next sentence.. Questo riconoscimento delle frasi non equivale a una revisione grammaticale dell'italiano.
-p prefisso riformatta soltanto le righe che iniziano con il prefisso indicato, eventualmente preceduto da spazi, e riapplica il prefisso alle righe prodotte. Il comando printf '# one two three four five six\nplain\040\040\040untouched\n' | fmt -p '# ' -w 20 riformatta la riga con # e conserva quella senza prefisso, inclusi i tre spazi tra plain e untouched. Le virgolette mantengono lo spazio nell'argomento '# '; qui # è un dato, non il prompt del terminale.
Rivedi sempre rientri, righe vuote, elenchi e citazioni. Normalmente GNU fmt non riunisce righe consecutive con rientri diversi, ma questo non garantisce la conservazione di una struttura complessa. Anche l'opzione -s richiede una verifica sul testo effettivo.
Accenti, tabulazioni e caratteri larghi vanno controllati nell'ambiente in cui il risultato sarà letto. I conteggi 18 e 8 dell'esempio riguardano ASCII: non dimostrano una corrispondenza universale tra larghezza impostata e larghezza visibile del testo Unicode.
| Opzione | Effetto |
|---|---|
-w N |
Imposta la larghezza; una parola lunga può superarla. |
-s |
Divide le righe lunghe senza unire quelle brevi. |
-u |
Usa uno spazio tra parole e due dopo le frasi riconosciute. |
-p prefisso |
Seleziona le righe con il prefisso e lo riapplica all'uscita. |
Domanda frequente
Fmt modifica il file originale?
Fmt legge il file e scrive sull'uscita standard. La scrittura in un file avviene quando redirigi quell'uscita. Usa un nome diverso dall'ingresso e controlla il risultato prima di sostituire documenti: un redirezionamento errato può cancellare l'ingresso anche se fmt non modifica direttamente i file.
Documentazione di riferimento
La pagina di manuale di GNU fmt, scritta dal progetto e pubblicata su man7.org descrive le opzioni; la versione pubblicata riguarda Coreutils 9.11. Per il comportamento della versione installata consulta anche il suo manuale locale. Per interpretare il confronto tra originale e risultato, consulta il comando diff.




