扩展命令的理解

扩展命令的理解

我无法完全理解命令-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
    ^       ^

我从零开始编号,以便位置与命令行上给出的数字相匹配。

相关内容