发布于2026-06-29 阅读(0)
扫一扫,手机访问
fmt 是 Linux 下一个专门用来整理文本段落的小工具。它读取文本、识别段落、合并短行、折行长行,还能保持空行分隔——不需要额外参数,就能让杂乱的文本变成规整的段落。
但实际用起来,事情往往没那么简单。不少人第一次用它就碰了壁:文件格式化完反而全被挤成了一行;代码注释里加 -p 参数,前缀却丢了;管道输入时输出错位得没法看。这些都是 fmt 容易被误解的地方,下面一个个说清楚。
这不是 bug,是 fmt 的默认行为:它把每个逻辑段落——也就是用空行分隔的文本块——先压缩成单行再重排。如果你看到“所有内容挤在一行”,说明原始文本里根本没有空行,fmt 自然就把整篇当成同一段处理了。
那么,怎么排查?用 cat -A file.txt 看一眼,就知道源文件里有没有 ^M 或者空白行。如果确实没有空行,又想强制按物理行切分,可以加 -s 选项——它只管拆分不重新组合——再配合 -w 指定宽度,比如 fmt -s -w 60 file.txt。另外要注意,如果原始文本里混了制表符或混合空格缩进,fmt 可能误判段落边界,先用 sed 's/^[[:space:]]*//' 清理一下首空格再试。
-p 要求前缀严格匹配行首,才算数。格式化之后,它会自动给每行重新加上这个前缀——前提是整行都以它开头,而且前面不能有空格。很多人在这里栽跟头。
常见失败场景有三个。第一,注释写成“ # long comment”,前面多了空格,fmt -p '# ' 自然不生效。解决办法是先 sed 's/^ * #/#/' 把空格去掉。第二,前缀本身带空格,比如“# ”,必须写成 -p '# ',少一个空格或者引号不闭合,都会报 invalid option。第三,多行注释里混用了 # 和 //,fmt 一次只能处理一种前缀,需要分两次调用才能覆盖所有情况。
简单来说,-c(crown-margin)让段落第一行顶格,后续行缩进;-t(tagged-paragraph)正好相反:第一行缩进,后续行顶格。具体用哪个,取决于你文本原本的缩进结构。
如果段落是首行缩进两格、其余顶格,用 -t。如果段落是首行顶格、第二行起缩进,用 -c。两个都不生效?大概率是原始缩进用的是制表符,而 fmt 默认按空格计算宽度。可以先加 -u 参数把全部空格统一,再试一次。
从管道进来的数据没有文件元信息,fmt 容易误判段落边界。最典型的场景是:一条长命令的输出被切成碎片,或者换行位置看起来特别诡异。
要避免这个问题,首先得确保输入是纯文本段落,没有混入 ANSI 转义序列——比如 ls --color 的输出就不能直接喂给 fmt,先过一遍 cat -v 检查一下。如果用 echo 测试,记得加引号:echo "long line" | fmt -w 40。不加引号的话,shell 会先按空格把内容切碎再传给 fmt,结果自然不对。如果想保留原始换行逻辑,可以试试 -d 选项,但注意这个选项不是所有发行版都支持——Ubuntu 22.04 以上有,CentOS 7 默认没有。
说到底,fmt 的段落识别完全依赖空行和行首空白,它不解析语义。你给它一篇 Markdown,它也只当普通文本处理。真正要安全格式化,得先剥离标记、统一缩进,再喂给 fmt。这活看着简单,细节上坑不少。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
4
5
6
7
8
9