fold默认按80字符折行,不识别单词边界,也不处理多字节字符;用-w需空格分隔,中文应优先用-b,-s可避免断词,输出不修改原文件。

fold 默认按 80 字符折行,不识别单词边界,也不处理多字节字符(如中文)——直接用 fold 处理中文或英文长句,大概率出现乱码或单词被硬切开。
fold -w 宽度设置不生效?检查是否漏了空格
常见错误是写成 fold-w50(连写),实际必须是 fold -w 50(选项和参数之间有空格)。GNU 版本虽支持 fold -w50 这种紧邻写法,但 BSD/macOS 的 fold 会报错:fold: illegal option -- 5。
- 正确写法:
fold -w 50 input.txt - 管道中也一样:
echo "hello world" | fold -w 10 - 终端自适应宽度可结合
tput cols:cat log.txt | fold -w $(tput cols)
英文文本想不断词?必须加 -s
fold -w 40 会在第 40 个字符处硬切,哪怕正切在 “internationalization” 中间。加上 -s 后,它会往回找最近的空格再断行,保证单词完整。
- 效果对比:
echo "This is a very long sentence" | fold -w 10→ 可能输出This is a+very long(“very” 被切开) - 加
-s:echo "This is a very long sentence" | fold -s -w 10→ 输出This is a+very long+sentence -
-s不保证每行刚好 ≤ 宽度:若某单词本身超宽(如一个 100 字符的 token),它仍会独占一行
中文/UTF-8 文本为什么显示乱码?优先用 -b 而非 -w
UTF-8 中文每个字符占 3 字节,但 -w 按“字符数”算,-b 才按“字节数”算。默认 fold -w 30 可能切在某个中文字符的第 1 或 2 字节中间,导致终端显示 或其他乱码。
- 安全做法:处理含中文的文本时,统一用
fold -b -w 30(注意-b和-w要一起用,-b本身不带数值) - 验证方式:用
xxd看输出字节流,确认没有孤立的 UTF-8 多字节序列 - 注意:
-b模式下-s无效——空格也是字节,它不会“找空格”,只认字节位置
fold 不改原文件,重定向才是保存结果的唯一方式
fold 是纯过滤器,所有输出都到 stdout,从不触碰输入文件。想存结果,必须显式重定向。
- 覆盖原文件?不行:
fold -w 60 file.txt > file.txt会清空文件(shell 先截断再执行命令) - 安全保存:用临时文件 + mv:
fold -w 60 file.txt > file.txt.tmp && mv file.txt.tmp file.txt - 或者用
sponge(来自 moreutils):fold -w 60 file.txt | sponge file.txt
真正容易被忽略的是:fold 对制表符(\t)和不可见控制字符完全无感知,它只数字符或字节。如果你的文本里混有缩进、ANSI 颜色码或零宽空格,fold 会把它们全算进去——而这些字符在终端里并不占可视宽度,结果就是“看着没超宽,却提前换行”。处理这类文本前,先用 cat -A 或 xxd 看清真实字节构成。











