fold是按指定宽度硬折行的文本工具,默认80字符截断且不识别单词边界,-s可避免单词中断但需配合-w使用,处理中文必须用-b按字节折行以防乱码。

fold 不是万能的文本格式化工具,它只做“按宽截断”,不重排、不补空格、不识别语义——用错选项或忽略编码,输出会乱码或单词被硬切。
fold 默认行为:80字符硬折行,不看空格
不加任何参数时,fold 每行最多输出 80 个字符,超出部分直接换行,不管是不是在单词中间。
比如一行含 120 个英文字符,会被切成两行:前 80 个 + 后 40 个,哪怕第 80 个是单词中间的字母。
- 适用于纯 ASCII 日志、固定列宽的机器生成文本(如某些 CSV 行)
- 不适合处理自然语言段落,尤其带中文或长单词时
- 若原文件某行不足 80 字符,该行原样输出,不补空格
用 -w 指定宽度,但别忘了 -s 防单词截断
fold -w 50 把每行限制为 50 字符,但默认仍可能把 networksecurity 切成 networksecu 和 rity。
加 -s 才会在空格处折行,保证单词完整:
echo "Linux network security tools are essential" | fold -w 15 -s
输出是:
Linux network security tools are essential
-
-s必须配合-w使用,单独-s无效 - 折行点选的是“行内最后一个空格”,不是“最近空格”;如果某段连续 60 字没空格,
-s也拦不住硬切 - 制表符
\t和换行符不被视为“空格”,-s对它们无效
处理中文必须用 -b,否则会乱码
UTF-8 中文一个字占 3 字节,但 fold 默认按“字符”计数(即 Unicode 码点),而多数 Linux fold 实现实际按字节解析 —— 这导致默认模式下中文常被从中间劈开,显示为 或其他乱码。
- 正确做法:
fold -b -w 30(注意-b和-w要一起用,-b自身不指定宽度) -
-b让fold按字节算宽,30 字节 ≈ 10 个中文(因每个汉字约 3 字节),不会切开单个汉字 - 但
-b会禁用-s:按字节折行时无法智能找空格,所以中英文混排时,英文单词仍可能被切 - 验证是否乱码:用
xxd或hexdump -C查看原始字节,确认折行点没落在 UTF-8 多字节字符中间
管道中使用 fold,别漏掉标准输入场景
fold 没给文件名时,默认读 stdin,这在管道里最常用:
ps aux | grep nginx | fold -w 80 -s
- 适合临时查看长命令行、日志片段、命令输出等
- 注意:管道上游若输出含控制字符(如
\r、ANSI 颜色码),fold会把它们当普通字符计数,可能导致视觉宽度和实际字符数不符 - 想对多行分别折行?不用额外处理 ——
fold本就是逐行工作的,每行独立计算宽度
真正容易被忽略的是:不同发行版的 fold 对 UTF-8 的支持程度不一,Ubuntu 22.04+ 和较新 coreutils 一般能较好处理 -b,但 Alpine 或旧 CentOS 可能需要先确认 fold --version 输出是否 ≥ 8.32;拿不准时,先用 file -i 看文本编码,再决定用 -b 还是 -w。


















