unexpand 命令如何处理多个选项卡?

unexpand 命令如何处理多个选项卡?

我尝试阅读 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请注意 ( )expandtabs(为支持它的终端设置制表符的命令)之间的差异:

  • 对于tabs,列从 1 而不是 0 开始编号
  • 您使用tabs -8(而不是expand -t 8) 每 8 列设置制表位(实际上,类似于tabs 9 17 25 33...,但您也可以使用tabs 9 +8 +8 +8...)。

相关内容