Perintah fmt Linux: tata ulang paragraf dan pemenggalan baris

Perintah fmt menata ulang pemenggalan baris dalam paragraf teks biasa agar lebih mudah dibaca. Fmt dapat menggabungkan baris pendek dan membagi baris panjang pada batas kata. Secara bawaan, hasil ditulis ke keluaran standar dan berkas masukan tetap ada.

Gunakan fmt untuk catatan atau draf prosa dengan pemenggalan baris yang tidak konsisten. Hindari menerapkannya langsung pada kode, CSV, tabel Markdown, atau log yang batas barisnya mempunyai arti khusus. Simpan hasil ke tujuan berbeda dan periksa perubahan sebelum mengganti dokumen asli.

Sintaks dan cara fmt mengenali paragraf

fmt [OPSI] [BERKAS...]

OPSI dan BERKAS adalah penanda yang perlu diganti. Tanpa nama berkas, atau dengan tanda - sebagai masukan, fmt membaca masukan standar. Periksa fmt --version, fmt --help, dan man fmt pada sistem yang dipakai. Contoh opsi di sini mengikuti GNU coreutils.

Dalam pemakaian bawaan GNU fmt, baris kosong memisahkan paragraf dan tetap dipertahankan. Baris masukan berurutan dengan tingkat indentasi berbeda tidak langsung digabung. Fmt memproses paragraf sebelum memilih tempat baris baru, sehingga hasilnya tidak sekadar memotong setiap baris pada posisi yang sama.

Siapkan catatan dan lihat penataan bawaan

Jalankan seluruh blok berikut di Bash atau shell yang mendukung sintaksnya. Mktemp membuat direktori latihan baru, lalu blok menyiapkan notes.txt dan salinannya, draft.txt. Perubahan direktori terjadi di dalam subshell, sehingga direktori kerja semula tidak berubah.

(
set -eu
labdir=$(mktemp -d)
cd "$labdir"
printf 'This note begins on a short line\nand continues with more words for paragraph formatting.\n\nA separate paragraph stays separate.\n' > notes.txt
cp notes.txt draft.txt
fmt notes.txt
printf 'Lab files: %s\n' "$labdir"
)

Paragraf pertama yang semula ditulis pada dua baris akan ditata ulang. Baris kosong tetap memisahkannya dari paragraf A separate paragraph stays separate. Fmt tidak mengubah kata-kata prosa menjadi ringkasan atau menerjemahkannya; yang diatur adalah susunan baris dan ruang sesuai opsi.

Setelah blok selesai, pindah ke lokasi yang dicetak sesudah Lab files: dengan cd "/jalur/latihan-yang-dicetak" dan ganti penanda jalurnya. Semua perintah yang memakai draft.txt di bawah dijalankan dari direktori latihan itu.

Tentukan lebar dan simpan hasil terpisah

Bandingkan lebar yang berbeda pada masukan sama

GNU fmt memakai lebar bawaan 75 kolom. Opsi -w menetapkan lebar maksimum yang dituju, sedangkan lebar sasaran internal biasanya lebih pendek. Karena pemilihan batas mempertimbangkan kata dan kalimat, setiap baris tidak harus mencapai nilai -w.

fmt -w 60 draft.txt

Periksa pemenggalan paragraf pada lebar 60, kemudian bandingkan dengan keluaran fmt notes.txt dari blok sebelumnya. Jumlah dan posisi baris dapat berubah, sementara baris kosong antarapagraf tetap ada. Untuk kata yang lebih panjang daripada batas, fmt dapat membiarkannya melewati lebar; -w bukan perintah untuk memotong setiap kata secara paksa.

Tulis ke berkas tujuan yang berbeda

fmt -w 72 draft.txt > draft-formatted.txt

Perintah ini menyimpan versi lebar 72 ke draft-formatted.txt. Periksa dengan cat draft-formatted.txt. Untuk membandingkan perubahan baris terhadap sumber, jalankan diff -u draft.txt draft-formatted.txt: pada data latihan ini ada perbedaan pemenggalan, sehingga diff dapat berstatus 1. Status tersebut berarti ada perbedaan, bukan otomatis kegagalan pembacaan.

Pengalihan > dapat menimpa berkas tujuan yang sudah ada. Pastikan jalurnya benar dan jangan mengarahkan hasil kembali ke draft.txt yang sedang dibaca, karena shell dapat mengosongkannya sebelum fmt mulai membaca. Pertahankan sumber selama hasil belum diperiksa.

Pahami contoh pemenggalan kata

Contoh mandiri berikut tidak membutuhkan berkas latihan. Data dari printf dibaca melalui pipa dan ditata dengan lebar 20.

printf 'one two three four five six\n' | fmt -w 20

Contoh keluaran GNU; susunan dapat berbeda pada implementasi atau opsi lain:

one two three four
five six

Kata four tetap utuh pada baris pertama dan five dimulai pada baris berikutnya. Fmt mencari tempat pemenggalan antarkata. Untuk pemenggalan baris pada lebar tertentu dengan aturan berbeda, periksa perintah fold; pemformatan paragraf dan pemotongan berkas menjadi beberapa bagian adalah pekerjaan yang berbeda.

Gunakan -s, -u, dan -p sesuai tujuan

Pertahankan baris pendek dengan -s

Secara bawaan, printf 'short line\nnext line\n' | fmt -w 60 menggabungkan kedua baris menjadi short line next line. Bandingkan dengan printf 'short line\nnext line\n' | fmt -s -w 60: kedua baris pendek tetap terpisah. Baris panjang masih dapat dipecah, sehingga -s juga bukan jaminan pelestarian seluruh format kode atau tabel.

Normalisasi spasi dengan -u

GNU -u mengurangi jarak menjadi satu spasi antarkata dan dua spasi setelah batas kalimat yang dikenali fmt. Contohnya, printf 'one\040\040two.\040\040\040Three\040four\n' | fmt -u -w 60 menghasilkan one two., dua spasi, lalu Three four. Escape oktal \040 pada printf menghasilkan spasi biasa sehingga jumlah spasi pada masukan dapat dicoba secara tepat.

Pengenalan kalimat mengikuti aturan fmt, bukan pemahaman tata bahasa yang lengkap. Periksa singkatan, tanda baca, dan teks dengan jarak khusus sebelum menerima perubahan. Tanpa -u, jangan menganggap semua spasi ganda otomatis dinormalisasi.

Batasi penataan ke awalan tertentu dengan -p

Perintah printf '> one two\n> three four\nKEEP raw\n' | fmt -p '> ' -w 60 menata ulang dua baris berawalan > menjadi satu baris > one two three four. Baris KEEP raw tetap terpisah dan tidak ditata. GNU fmt melepaskan awalan sementara saat memformat lalu menambahkannya kembali pada hasil.

Awalan teks seperti tanda kutipan bukan berarti fmt memahami seluruh dokumen Markdown. Pastikan baris yang dipilih memang prosa dan periksa hasilnya, terutama bila awalan atau indentasi mempunyai peran lain.

Ringkasan opsi

Opsi Kegunaan
-w N Menetapkan lebar maksimum yang dituju; kata panjang dapat melampaui batas.
-g N Menetapkan lebar sasaran untuk pemilihan pemenggalan baris.
-s Membagi baris panjang tanpa menggabungkan baris pendek.
-u Memakai satu spasi antarkata dan dua setelah batas kalimat yang dikenali.
-p AWALAN Menata baris dengan awalan tertentu dan memasang kembali awalannya.

Periksa struktur, karakter lebar, dan perubahan

Indentasi, tab, butir daftar, kutipan, dan baris kode perlu ditinjau secara khusus. Fmt bukan parser format dokumen: kata yang masih terbaca tidak membuktikan bahwa makna struktur tetap sama. Simpan versi asli dan bandingkan perubahan baris sebelum menerapkan hasil pada dokumen kerja.

Angka lebar tidak selalu sama dengan lebar visual pada setiap terminal, font, pengodean, atau implementasi. Jika teks memuat karakter multibyte, karakter lebar, atau tanda gabungan, uji contoh yang mewakili data Anda. Contoh keluaran pendek di atas memakai ASCII dan tidak membuktikan tata letak semua bahasa.

Aturan paragraf, spasi, awalan, dan lebar sasaran dijelaskan dalam manual GNU coreutils 9.11, bagian fmt invocation. Ringkasan opsi tersedia pada manual GNU fmt yang ditayangkan di man7.

FAQ

Apakah fmt mengubah berkas asli?

Pemakaian dasar membaca masukan dan menulis hasil ke keluaran standar. Pengalihan keluaran menentukan berkas yang ditulis. Gunakan tujuan berbeda dan periksa jalurnya agar sumber tidak tertimpa atau terkosongkan.

Mengapa baris hasil lebih pendek daripada nilai -w?

Fmt memilih batas antarkata dengan lebar sasaran dan aturan pemenggalan paragraf. Nilai -w tidak berarti setiap baris harus diisi tepat sampai kolom tersebut; kata yang sangat panjang juga dapat melewatinya.