为什么 Expand 使用不同数量的空格字符?

为什么 Expand 使用不同数量的空格字符?

为什么 Expand 命令不将每个制表符转换为恰好 8 个空格字符?

例如:this^Iis^Itabs (^I代表制表符)

变成:this____is______tabs____ (添加下划线以显示空格)

代替:this________is________tabs________

根据我的测试,似乎 Expand 会获取单词边界中制表符之前的所有字符,然后将制表符转换为所需的空格数,总共添加 8 个字符(包括该单词边界内的字符) 。

这是为什么?

手册页没有给我任何关于这种行为的提示。

答案1

expand实用程序将字符扩展tab至下一个隐式制表位。从历史上看,因此默认情况下,这些字符是每八个字符,但您可以使用选项更改它们-t

printf "%s\t%s\t%s\n" 12345 1234 123
12345   1234    123

printf "%s\t%s\t%s\n" 12345 1234 123 | expand
12345   1234    123

printf "%s\t%s\t%s\n" 12345 1234 123 | expand -t 10
12345     1234      123

printf "%s\t%s\t%s\n" 12345 1234 123 | expand -t 10,16
12345     1234  123

如果您真的只想替换tab为八个空格,您可以使用sed

printf "%s\t%s\t%s\n" 12345 1234 123 | sed 's/\t/        /g'

答案2

这正是主意选项卡的,它会跳转到下一列,该位置不会随着前一个字段的宽度而改变。例如,这里的选项卡使第二列很好地对齐:

$ echo $'123\tfoobar\n123456\tblahblah'
123     foobar
123456  blahblah

如果两行的空格数相同,结果会很难看:

123        foobar
123456        blahblah

对于 8 字符制表位,这当然仅在值是 0 到 7(或 8 到 15 等)字符宽时才有效,超过 8 字符限制的变化再次给出丑陋的结果:

$ echo $'123\tfoobar\n123.345e6\tblahblah'
123     foobar
123.345e6       blahblah

因此,这需要将制表位设置为不同的值:

$ echo $'123\tfoobar\n123.345e6\tblahblah' | expand -t 12
123         foobar
123.345e6   blahblah

除了使用制表符之外,另一种进行类似输出的方法是使用printf固定宽度字段(这本质上类似于 的输出expand):

$ printf "%-11 %s\n" 123 foobar 123.345e6 blahblah
123          foobar
123.345e6    blahblah

答案3

手册页expand 表示默认制表符间距为八个字符:

-t,--选项卡=数字

制表符间隔 NUMBER 个字符,而不是 8 个字符

信息页(GNU 项目更喜欢手册页)类似地指出

默认操作相当于-t 8(每 8 列设置选项卡)。

但更明确的是,选项卡是每个x 列在终端中,而不是插入x 空格字符。正如评论中所指出的,选项卡以前是按特定偏移量连接到打字机的物理剪辑,以允许前进到特定列,以进行柱状格式化。

相关内容