我无法完全理解命令-t
的参数是如何expand
工作的。以下是其联机帮助页的摘录。
NAME
expand - convert tabs to spaces
...
-t, --tabs=N
have tabs N characters apart, not 8
到底是做什么的制表符间隔 N 个字符意思是?我做了一些测试。
root@u2004:~# printf "a\tb\n"
a b
root@u2004:~# printf "a\tb\n" | od -a
0000000 a ht b nl
0000004
root@u2004:~# printf "a\tb\n" | expand | od -a
0000000 a sp sp sp sp sp sp sp b nl
0000012
root@u2004:~# printf "a\tb\n" | expand -t 4 | od -a
0000000 a sp sp sp b nl
0000006
root@u2004:~# printf "a\tb\n" | expand -t 5 | od -a
0000000 a sp sp sp sp b nl
0000007
root@u2004:~#
正如你所看到的,当我通过 时-t 4
,制表符被替换为 3 个空格。那么,实际上,“制表符间隔 4 个字符”只是意味着制表符被替换为 3 个空格?我无法理解。顺便说一句,我不是以英语为母语的人,这可能是一个与英语相关的问题。
答案1
它指的是标签停止,选项卡跳转到的位置。对于-t 4
,每四个字符就有一个制表位。
制表符不会插入固定数量的空格,而是跳转到下一个这样的位置,因此添加的空格数量取决于制表符之前的文本长度。例如:
$ printf "1\tx\n" | expand -t 4 | od -a
0000000 1 sp sp sp x nl
0000006
$ printf "123\tx\n" | expand -t 4 | od -a
0000000 1 2 3 sp x nl
0000006
当然,重点是让列对齐:
$ printf "123\tx\n1\tx\n" |expand -t4
123 x
1 x
因此,为了尝试直观地表示它,制表位的位置如下所示,并^
显示停止位:
123412341234...
^ ^ ^
(当然,您无法按 Tab 键跳到最开始,因此第一个并不真正存在。)
但是,如果一个字段比制表位距离长,那么情况就会变得混乱,但expand
需要一个列位置列表作为替代方案,例如,它有一个四宽列和一个八宽列:
$ printf "%b\n" 'A\t1234567\thello' 'B\t987\tworld' |expand -t4,12
A 1234567 hello
B 987 world
那里的站点如下:
11111111112
012345678901234567890...
A 1234567 hello
B 987 world
^ ^
我从零开始编号,以便位置与命令行上给出的数字相匹配。