-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
不是 - 它会按原样打印。