在 Linux 终端和脚本里,经常需要让文本保持单行、不折行,无论是查看日志、处理数据,还是控制终端显示格式。
终端查看时不折行
用 less 查看长文本时,默认会在屏幕宽度处自动折行。加 -S 参数可以让长行直接截断,右侧内容通过左右方向键查看,不会折成多行 [1]。
less -S longlog.txt
进入 less 后按 - 再按 S 也可以临时切换。
合并多行为单行
如果要把文件里多个换行合并成一行,最直接的是 tr -d '\n',它删除所有换行符 [2]。
# 把 file.txt 所有行拼成一行
tr -d '\n' < file.txt
# 合并后在末尾补一个换行,避免 shell 提示符粘在同一行
tr -d '\n' < file.txt; echo
sed 也能做,适合需要保留特定换行的场景 [3]。
# 只保留空行作为段落分隔
sed '/^$/!{H;d;};x;s/\n/ /g' file.txt
按宽度截断,保留单行
需要限制每行最大字符数时,用 cut -c1-80 截取前 80 个字符,超出部分直接丢弃 [4]。
cut -c1-80 longline.txt
如果要在指定宽度处折行,用 fold -w 80 [5]。
fold -w 80 file.txt
fmt 可以重排段落,适合处理 prose 文本 [6]。
fmt -w 80 file.txt
awk 控制输出换行
awk 通过修改 ORS(输出记录分隔符)可以完全控制换行行为 [7]。
# 所有输出用空格分隔,不再自动换行
awk -v ORS=' ' '{print}' file.txt
# 只在空行处换行
awk 'NF{printf "%s ", $0; next} {print ""}' file.txt
排错速查
| 现象 | 原因 | 处理 |
|---|---|---|
tr -d '\n' 后 shell 提示符粘在一行 |
输出末尾没有换行 | 命令后补 ; echo |
less -S 看不到右侧内容 |
长行被截断 | 按右方向键或 ESC-\ 跳到行尾 |
fold 在单词中间断开 |
缺少 -s 参数 |
改用 fold -s -w 80 |
cut 输出乱码 |
文件含多字节字符 | 改用 fold -b 或 cut -b 按字节截断 |
草稿待审;less、fold、sed、awk、tr、cut 命令均已 WSL Ubuntu 24.04 实测通过。
参考资料
- [1] less(1) – Linux manual page (man7.org)(less1)
- [2] tr(1) – Linux manual page (man7.org)(tr1)
- [3] sed(1) – Linux manual page (man7.org)(sed1)
- [4] cut(1) – Linux manual page (man7.org)(cut1)
- [5] fold(1) – Linux manual page (man7.org)(fold1)
- [6] fmt(1) – Linux manual page (man7.org)(fmt1)
- [7] awk – pattern-directed scanning and processing language (Ubuntu manpages)(awk1)
文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。