unexpand 命令详解
更新时间:2026-08-28。本文是「一个命令一个文档」系列,属于文本处理命令族(见文本处理命令族)。它是 expand(见expand)的反向:把空格压回 Tab。
unexpand 把文本里的连续空格替换成 Tab 字符,让文件更紧凑、对齐更省字符。默认只转换行首的空格,加 -a 才转换所有位置。
一、基本用法
bash
unexpand file.txt > file.tsv # 默认只把行首空格转 Tab
unexpand -a file.txt > file.tsv # -a:所有连续空格尽可能转 Tab
unexpand -t 4 file # -t 4:每 4 空格 = 1 Tab默认行为很"保守"——只动行首缩进。加
-a才把正文里成片的空格也压成 Tab。-t和 expand 对应,控制几空格合成一 Tab。
二、与 expand 的关系
bash
expand -t 4 file | unexpand -t 4 -a # 往返:先统一空格再压回 Tab两者是互逆。常见组合:先把别人的文件 expand 成空格统一格式处理,完事再
unexpand -a压回 Tab 省体积。注意往返不一定 100% 还原(对齐语义可能变)。
三、实战:紧凑存储
bash
expand -t 4 src.py | unexpand -t 4 -a > compact.py # 统一后再压缩空白历史项目或想减小体积(Tab 比多个空格占字节少)时,用 unexpand 压空白。现代多主张"一律空格"(靠 .editorconfig 约束),unexpand 更多用于维护老 Tab 风格代码。
四、与 sed/tr 区别
bash
sed 's/ /\t/g' file # 简单4空格换Tab,但不按制表位列对齐
unexpand -t 4 -a file # 按列计算,正确对齐同 expand 的道理:sed/tr 做不了"按制表位对齐"的效果,unexpand 会算"这里有几个空格、该合成几个 Tab",才是真对齐。
一句话总结
unexpand = 空格转 Tab(expand 反向,见expand):默认只转行首空格,-a 转所有连续空格,-t N 设几空格合一 Tab;用于压空白省体积/维护老 Tab 代码。与 sed/tr 替换不同,它按制表位列计算、真正对齐。现代多主张统一空格,unexpand 多见于老项目。