tac--之前的解释

tac--之前的解释

-b, --之前

分隔符附加到文件中位于其前面的记录的开头。

我无法理解以下输出:

$ echo -e "Hello\nNew\nWorld\n!" > file
$ tac file
!
World
New
Hello
$ tac -b file


!
World
NewHello

New为什么和之间没有换行符Hello

答案1

tac使用记录及其分隔符,随附的,默认在对应记录之后。与分隔符分离的其他基于记录的工具(例如 AWK)相比,这有点违反直觉。

对于-b,记录及其附加换行符如下(按原始顺序):

  • Hello
  • \nNew
  • \nWorld
  • \n!
  • \n

反向输出,就变成了

\n\n!\nWorld\nNewHello

这对应于您看到的输出。

如果没有-b,记录及其附加换行符如下:

  • Hello\n
  • New\n
  • World\n
  • !\n

反向输出,就变成了

!\nWorld\nNew\nHello\n

答案2

对我来说,这确实看起来很奇怪,部分原因是它的tac工作方式有点违反直觉。让我们使用清晰可见的分隔符——逗号。

我希望看到以下命令的结果:

% echo -ne 'A,B,C' | tac -s,

嗯,我认为 A 与 B 分开,B 与 C 分开。因此(我得出结论)反向打印,它们应该构成C,B,A。让我们检查。唉,它的打印方式有所不同:

% echo -ne 'A,B,C' | tac -s,
CB,A,

我们可以得出tac原始分隔符放置的棍子的结论:A之后仍然有它,也B有,但C没有它,因此它按原样打印。

如果我tac-b这个时间运行会发生什么?

% echo -ne 'A,B,C' | tac -bs,
,C,BA

看起来它是这样工作的-b:它向后遍历输入,直到找到分隔符。发现它打印出来了:

,。然后它打印搜索时跳过的文本:

C。然后重复循环:

,B。由于没有剩余分隔符,因此仅打印剩余部分:

A

为什么New和Hello之间没有换行符?

根据我上面给出的解释,New它将在一个新行上,因为它以换行符为前缀,但因为Hello不是 - 它会按原样打印。

相关内容