-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\nNew\nWorld\n!\n反向输出,这变成
!\nWorld\nNew\nHello\n
Run Code Online (Sandbox Code Playgroud)
对我来说,这确实看起来很奇怪,部分原因是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不是 - 它会按原样打印。