为什么 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