expand 命令详解
更新时间:2026-08-28。本文是「一个命令一个文档」系列,属于文本处理命令族(见文本处理命令族)。Tab 和空格混用导致对齐错乱?统一成空格就靠它。
expand 把文本里的 Tab 字符替换成对应数量的空格(按制表位对齐)。反向操作是 unexpand(空格转 Tab)。
一、基本用法
bash
expand file.tsv > file.txt # Tab 全变空格
expand -t 4 file # -t 4:一个 Tab = 4 个空格
expand -t 2,4,6 file # 自定义各制表位列宽默认一个 Tab 展开成 8 个空格(传统制表位)。
-t N改成 N 个。对齐错乱常因别人用 4 空格、你用 8 空格展开,统一-t值即可。
二、反向:unexpand
bash
unexpand -a file.txt > file.tsv # 空格尽可能转回 Tab(-a 所有连续空格)unexpand 把连续的空格压回 Tab,节省字符、对齐紧凑。
-a转换所有空白列(不止行首)。两者配合可在"人读(空格对齐)"和"紧凑存储(Tab)"间转换。
三、为什么统一很重要
bash
# diff 对 Tab/空格敏感:同样的"对齐"在 diff 眼里可能不同
# 编辑器显示宽度不同导致 review 时错位
expand -t 4 a.tsv > a.txt && expand -t 4 b.tsv > b.txt
diff a.txt b.txt # 都转空格后再比,避免 Tab/空格假差异跨编辑器/跨人协作时 Tab 宽度设置不同会引发对齐错觉和假 diff。
expand统一成空格是消除这类噪声的标准做法(很多项目用.editorconfig强制)。
四、与 tr / sed 替代
bash
sed 's/\t/ /g' file # 简单把 \t 换成4空格(不按制表位对齐!)
tr '\t' ' ' < file # 单字符替换,同样不按列对齐tr/sed 只能做"字符→字符"替换,不会像
expand那样按制表位算出"补到几列"。要真正对齐必须用expand,否则 Tab 在第 5 列和在第 1 列的空格数会错。
相关命令
一句话总结
expand = Tab 转空格(按制表位对齐):默认 1 Tab=8 空格,-t N 设 N 空格(消除跨编辑器对齐错乱);unexpand -a 反向压回 Tab;与 tr/sed 替换不同,expand 按列计算补空格数、真正对齐。统一格式后 diff 才不被 Tab/空格假差异干扰。