fold 與 fmt:文字格式化工具
在 Linux 系統管理與資料處理的場景中,我們經常需要處理純文字檔案。無論是檢查日誌檔、準備報表,還是透過管道(pipe)傳遞資料,文字的寬度與換行格式往往會影響後續的處理流程。這時,fold 與 fmt 這兩個看似簡單卻極其強大的文字格式化工具便派上用場了。它們雖然都涉及「換行」,但核心邏輯截然不同:fold 負責強制折行,而 fmt 負責智能重排。
fold:強制折行工具
fold 指令的主要功能是將長行文字強制折斷,使其不超過指定的欄位寬度。它不會改變文字的內容,只是單純地在特定位置插入換行字元。這在將資料輸出到終端機、舊式列印機,或需要固定寬度輸入的系統時非常有用。
基本用法與選項
最基礎的 fold 指令會預設以 80 個字元為寬度進行折行。若需自訂寬度,可使用 -w(或 --width)選項。此外,-s(或 --spaces)選項是一個關鍵細節,它指示 fold 在折行時優先尋找空白字元作為斷點,若找不到則才強制折斷。
實際範例
假設我們有一個包含長句的文字檔案 long_text.txt,內容如下:
$ cat long_text.txt
This is a very long line that exceeds the standard terminal width and needs to be wrapped for better readability.
若我們不指定任何選項,fold 預設以 40 個字元為寬度進行折行(註:不同系統預設可能為 80,此處為示範效果設定較小寬度):
$ fold -w 40 long_text.txt
This is a very long line that exceeds
the standard terminal width and needs t
o be wrapped for better readability.
注意看第二行結尾的 t,這是因為第 40 個字元正好落在 needs 這個字的中间,fold 強制將其切斷。
若加上 -s 選項,fold 會嘗試在空白處折行:
$ fold -w 40 -s long_text.txt
This is a very long line that exceeds
the standard terminal width and needs
to be wrapped for better readability.
現在折行點都落在字詞之間,閱讀起來更為自然。這在處理程式碼或自然語言文字時非常實用。
fmt:智能文字重排工具
與 fold 不同,fmt 的主要目的是將多行文字「重排」成單一或多行段落,使其符合指定的欄位寬度,同時盡量保持字詞的完整性。它常用於清理從網頁複製過來的破碎文字,或將單行長句轉換為易讀的段落。
基本用法與選項
fmt 預設會將輸入文字重排為 75 欄寬的段落。使用 -w 選項可自訂寬度。-s 選項則指示 fmt 在遇到連續空白字元時不要合併它們(預設行為是將多個空白壓縮為一個)。
實際範例
假設我們有一個文字片段,其中的空格分布不均勻,且行長混亂:
$ cat messy_text.txt
Linux is a powerful operating
system. It supports multiple architectures.
使用 fmt 進行標準重排:
$ fmt -w 50 messy_text.txt
Linux is a powerful operating system. It supports
multiple architectures.
觀察結果,fmt 自動將多餘的空白壓縮為單一空格,並將文字重新組合為寬度約 50 的字元行,且確保字詞不被切斷。
若我們希望保留原始的多個空格(例如用於對齊表格),可加上 -s 選項:
$ fmt -w 50 -s messy_text.txt
Linux is a powerful operating
system. It supports multiple architectures.
注意:在某些版本的 fmt 中,-s 的行為可能僅限於不合併連續空白,具體取決於 GNU coreutils 的實作。在 Ubuntu 22.04 中,-s 主要用於防止合併連續的空白字元,但 fmt 仍會嘗試重排行結構。若需完全保留原始格式僅做輕微調整,建議搭配 cat -A 檢查。
常見問題
1. fold 與 fmt 在處理空白字元上有何差異?
fold 幾乎不關心空白字元,它只關心字元計數。若 -s 未啟用,它會在任何位置(包括字詞中間)強制折行。fmt 則以「字詞」為單位進行重排,它會自動壓縮連續空白為單一空格,並確保字詞不被切斷。因此,若你需要保留原始格式僅做寬度限制,fold 較合適;若你需要清理並重排段落,fmt 是首選。
2. 當文字中包含特殊字元或 UTF-8 多位元字元時,兩者行為是否一致?
在 Ubuntu 22.04 / Debian 12 上,fold 預設以「位元組」為單位計算寬度,這可能導致中文或 Emoji 等 UTF-8 字元被錯誤切斷。為解決此問題,可加上 -b 選項(以位元為單位)或使用 --bytes,但更建議在執行前確認環境變數 LC_ALL 或 LANG 是否設定為 en_US.UTF-8,以確保正確的字元處理。fmt 同樣受此影響,若遇到多位元字元問題,建議使用 fold -b 或確保系統 locale 正確設定,以避免亂碼。
小結
fold 與 fmt 是 Linux 文字處理工具箱中不可或缺的小工具。fold 像是一把精準的剪刀,負責強制折行;而 fmt 則像是一位編輯,負責整理段落與空白。掌握這兩者的差異與選項,能讓你在處理純文字資料時更加得心應手。下次遇到長行文字或格式混亂的檔案時,不妨試試看這兩個指令,或許能解決你不少麻煩。