Linux fmt 命令详解:文本文件格式优化与排版处理的实战指南

原创2026-09-30 17:40:50805 阅读
文章标签:文档教程

Linux fmt 命令详解:文本文件格式优化与排版处理的实战指南

本文以 Linux 命令大全仓库 command/fmt.md 文档为核心,系统讲解 fmt 命令的语法、全部选项语义与实战用法,并结合仓库内 fold、pr、col、expand 等文本处理命令,说明 fmt 在文本整理、代码注释对齐、段落重排等场景中的具体应用,帮助你快速掌握这条 Linux 文本处理常用命令。

fmt 命令是什么

fmt 是 Linux 下一款文本格式优化工具:它读取文件的内容,根据选项的设置对文件格式进行简单的优化处理,并将结果送到标准输出设备(默认终端)。fmt 不会直接修改源文件,而是把重排后的结果输出到标准输出,因此它非常适合与重定向、管道等 shell 机制配合使用。

在本仓库的 Linux 命令分类中,fmt 与 awk、sed、grep、tr、wc、sort 等一同被归入「文本处理」分类(见 README.md 中的分类列表),是处理段落级排版的核心命令之一。

语法

fmt(选项)(参数)
  • 选项:控制 fmt 的排版行为,例如是否缩排、是否拆分、每列最大字符数等;
  • 参数:指定要优化格式的文件;若不提供文件参数,fmt 会从标准输入读取数据(这在管道场景中非常常用)。

选项详解

fmt 的全部选项如下,逐条说明其含义与适用场景:

-c或--crown-margin:每段前两列缩排;
-p<列起始字符串>或-prefix=<列起始字符串>:仅合并含有指定字符串的列,通常运用在程序语言的注解方面;
-s或--split-only:只拆开字数超出每列字符数的列,但不合并字数不足每列字符数的列;
-t或--tagged-paragraph:每列前两列缩排,但第1列和第2列的缩排格式不同;
-u或--uniform-spacing:每列字符之间都以一个空格字符间隔,每个句子之间则两个空格字符分隔;
-w<每列字符数>或--width=<每列字符数>或-<每列字符数>:设置每列的最大字符数。

-w / --width:设置每列的最大字符数

-w 是 fmt 最常用的选项,用于指定重排后每行(每列)允许的最大字符数。它有三种等价写法:

fmt -w 60 filename     # 长选项写法
fmt --width=60 filename
fmt -60 filename       # 简写形式,直接用数字

实际使用时,fmt 会尽量把内容填充到接近该宽度,遇到过长单词等无法拆分的情况时允许适度超出。这个选项在以下场景中尤其有用:

  • 把宽行文本压缩到适合屏幕显示的宽度;
  • 为邮件、文档准备固定宽度的段落;
  • 在管道中动态控制输出宽度,例如 echo "一段很长的文字" | fmt -w 30。

-c / --crown-margin:每段前两列缩排

该选项采用"皇冠式"缩排(crown margin),让段落前两行按不同的缩进呈现,通常用于诗歌、引用等需要特殊视觉层次的文本。开启后 fmt 会根据前两行的缩进情况推断后续行沿用相应缩进。

-p / --prefix:仅合并含指定字符串的行

-p 允许指定一个字符串作为"前缀匹配条件",fmt 只对以该字符串开头的行进行合并与重排,其他行保持原样。仓库文档明确指出它"通常运用在程序语言的注解方面",典型场景是统一格式化代码中的注释块:

fmt -p "//" source.c      # 只重排以 // 开头的 C/C++ 注释行
fmt -p "#"  script.sh     # 只重排以 # 开头的 shell 脚本注释行

这对于批量规整代码注释的换行宽度非常实用,且不会触碰代码正文。

-s / --split-only:只拆不并

默认情况下 fmt 既会把过长的行拆开,也会把过短的相邻行合并起来。-s 则只执行"拆分"动作:超出每列字符数的行被拆开,但字数不足的行不会被合并。当你只希望打破超长行、又不想改变原本的短行结构(例如保留列表项或单行内容)时,用 -s 最合适。

-t / --tagged-paragraph:标签式段落缩排

-t 同样对每段前两行进行缩排,但与 -c 不同的是,第 1 行与第 2 行的缩排格式不同——它专门针对"标签式段落"设计,即段落第一行带有一个标签(如编号、列表符号、缩进标题),后续行统一对齐到标签之后的位置。

-u / --uniform-spacing:统一空格间隔

-u 将文本的空格分布规范化为统一格式:列(词)与列之间以一个空格字符间隔,句子与句子之间以两个空格字符分隔。它会把多个连续空格压缩为单空格,适合清洗从网页或其他来源复制来的、含有不规则空格的文本。

参数说明

fmt 的参数为需要优化格式的文件路径:

fmt 文件名

fmt 会把该文件内容按当前选项重排后输出到标准输出,不会改动原文件。若需保存结果,使用 shell 重定向即可:

fmt -w 80 input.txt > output.txt

实战示例

以下示例覆盖 fmt 的典型用法,均可在 shell 中直接验证。

示例 1:按指定宽度重排文本

# 准备一段超宽文本
echo "Linux 命令大全搜索工具,内容包含 Linux 命令手册、详解、学习、搜集,非常值得收藏。" > note.txt

# 以每列 30 字符重新排版
fmt -w 30 note.txt

输出会被重排为多行,每行不超过 30 个字符,段落保持连续不被打断。

示例 2:从标准输入读取并处理

echo "这是通过管道传递给 fmt 的一行超长文本内容。" | fmt -w 20

示例 3:统一空格间隔

echo "这是  一个    含有 多个   空格  的句子。这是第二个句子。" | fmt -u

-u 会把词间多余空格压缩为单个空格,句子之间调整为两个空格。

示例 4:只拆分不合并

# 文件内容既有超长行,也有独立短行
fmt -s -w 40 mixed.txt

超长行被拆开,短行原样保留。

示例 5:格式化代码注释

fmt -p "//" -w 72 source.c

只对以 // 开头的注释行按 72 字符宽度重排,代码行不受影响。

与其他文本处理命令的配合

fmt 常与仓库中收录的同类文本处理命令搭配使用,构成完整的文本处理链路:

  • fold:按指定宽度折行,但它按字节/字符边界硬切行,不做段落级合并重排;fmt 则基于词边界智能换行。需要"严格截断"时用 fold -w,需要"智能重排段落"时用 fmt -w;
  • pr:把文本转换成适合打印的分页格式,为页面添加标题与分页符;fmt 负责行级排版,pr 负责页面级输出;
  • col:过滤标准输入中的 RLF/HRLF 等控制字符,常用于清洗 man 手册等含控制字符的文本,可与 fmt 串联:先 col -b 去控制字符,再 fmt 重排;
  • expand / unexpand:负责制表符与空格的互转,与 fmt -u 的空格规范化目标互补。

典型管道组合:

col -b < /usr/share/man/man1/fmt.1.gz | fmt -w 100 | less

在本仓库中的位置

本文档源码位于 command/fmt.md,是 Linux 命令大全项目 600 多个命令手册之一。项目通过 template/details.ejs 将 command 目录下的 Markdown 文档渲染为静态 HTML 页面,并配合搜索组件提供命令速查(对应模板见 template/widget/search.ejs)。如果你希望离线查阅 fmt 等命令的 Markdown 原文,可以直接阅读 command 目录中的对应文件;README 的分类清单中也将 fmt 明确归入「文本处理」类别,方便按类目检索。

登录后查看全文
linux-command