expand命令为何不将每个制表符转为8个空格,而是使用不同空格数?
为什么
expand命令不把每个制表符转换为恰好8个空格? 哈哈,这个问题问得很到位——其实这完全是expand命令的设计初衷,它可不是简单的「制表符转固定空格」工具,而是模拟了传统打字机里的「制表位」逻辑:
默认情况下,expand会把每8个字符设为一个「制表位」(你也可以用-t参数修改这个间隔,比如expand -t 4就是每4个字符一个制表位)。当它遇到制表符\t时,不会直接塞8个空格,而是先计算当前位置到下一个制表位还差多少字符,然后填充对应的空格数,把光标「跳」到下一个制表位上。
拿你举的例子拆解一下就清楚了:
原始字符串:this^Iis^Itabs(^I代表制表符)
- 第一个制表符前的
this有4个字符,离下一个制表位(第8位)还差4个字符,所以填充4个空格,变成this____ - 加上后面的
is后,总长度是4+4+2=10,下一个制表位是第16位,差6个字符,所以第二个制表符填充6个空格,变成this____is______ - 再加上
tabs后总长度是16+4=20,下一个制表位是第24位,差4个字符,最后填充4个空格,就得到了你看到的this____is______tabs____
这种设计是为了让文本自动对齐到规整的制表位,不管前面内容多长,都能让后续内容对齐到统一的位置,特别适合代码缩进、简单表格排版这类场景。
如果你就是想把每个制表符硬替换成8个空格,不用管对齐逻辑,那可以用其他工具实现:
- 使用
sed命令:sed 's/\t/ /g'(注意这里要输入满8个空格) - 使用
tr命令:tr '\t' ' '(同样需要输入8个空格)
内容的提问来源于stack exchange,提问作者Jeff Reeves
相关产品推荐
相关产品推荐

