tac --before 的解释

San*_*aXL 12 coreutils tac

-b, --before

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

我无法理解以下输出:

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


!
World
NewHello
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*itt 23

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

使用-b,附加换行符的记录如下(按原始顺序):

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

反向输出,这变成

\n\n!\nWorld\nNewHello
Run Code Online (Sandbox Code Playgroud)

这对应于您看到的输出。

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

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

反向输出,这变成

!\nWorld\nNew\nHello\n
Run Code Online (Sandbox Code Playgroud)


poi*_*ige 5

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

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

% echo -ne 'A,B,C' | tac -s,
Run Code Online (Sandbox Code Playgroud)

?

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

% echo -ne 'A,B,C' | tac -s,
CB,A,
Run Code Online (Sandbox Code Playgroud)

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

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

% echo -ne 'A,B,C' | tac -bs,
,C,BA
Run Code Online (Sandbox Code Playgroud)

似乎它以这种方式工作-b:它向后遍历输入,直到找到分隔符。发现它被打印出来:

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

C. 然后循环重复:

,B. 由于没有分隔符,只打印剩余部分:

A.

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

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