Linux fmt 命令详解:文本文件格式优化与排版处理的实战指南
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 明确归入「文本处理」类别,方便按类目检索。