我尝试阅读 unexpand 手册并阅读答案这里但我不明白 unexpand 如何使用 tablist 作为参数。
当我尝试以下操作时(2 个空格和 3 个空格期望它们转换为制表符)
$ unexpand -t 2,3,4
12**345***678
我明白了
12\t\t345***678
*
代表一个空间(*
为了清楚起见,我使用了它)。我不知道为什么 2 之后有两个制表符,而 5 之后没有制表符,尽管有 3 个空格。
我还尝试了以下操作(预计第二列和第五列中的空白将转换为制表符)
$ unexpand -t 2,5
1*23*4567
我明白了
1*23*4567
我也尝试过
$ unexpand -t 2,5
1**2*****345
我明白了
1\t*2*****345
我无法理解当有多个参数时程序如何解释 tablist 参数。
答案1
unexpand
做相反的事情expand
。如果你这样做了unexpand -t 2,3,4 | expand -t 2,3,4
,你应该回到原来的状态。
这些数字不是选项卡之间的距离,而是它们的位置(距屏幕左侧的距离)。
您-t 2,3,4
将第一个制表位设置为偏移量 2(第三列),第二个制表位设置为偏移量 3,第三个制表位设置为偏移量 4,仅此而已。
↓↓↓
0123456
$ printf '%b|\n' '\t' '\t\t' '\t\t\t' | expand -t2,3,4
|
|
|
1、2、3 选项卡位于:
123
如果您将其与您的:
123
12**345***678
它3
位于第三个制表位,因此您需要两个选项卡才能2
到达那里,第一个选项卡将您带到第二个制表位(因为您已经到达第一个制表位),第二个选项卡将带您到第三个制表位。之后没有制表符,因此您的空格不会转换为制表符。
如果您希望第二个制表位在第二个制表位之后 3 列,第三个制表位在第二个制表位之后 4 列,您需要-t 2,5,9
:
↓ ↓ ↓
0123456789
$ printf '\t1\t2\t3\n' | expand -t 2,5,9
1 2 3
然后你会得到:
↓ ↓ ↓
01234567890
$ echo '12 345 678' | unexpand -t 2,5,9 | sed -n l
12 345\t 678$
un
请注意 ( )expand
和tabs
(为支持它的终端设置制表符的命令)之间的差异:
- 对于
tabs
,列从 1 而不是 0 开始编号 - 您使用
tabs -8
(而不是expand -t 8
) 每 8 列设置制表位(实际上,类似于tabs 9 17 25 33...
,但您也可以使用tabs 9 +8 +8 +8...
)。