tac 命令的选项会产生奇怪的输出 [理解问题]

erc*_*rch 4 utilities coreutils text-processing

说我有这个文件,只包含

a
b
c
b
a
Run Code Online (Sandbox Code Playgroud)

使用tac --separator=a file在BASH [在基于Debian的Linux],我得到这样的:

                  # empty line
                  # empty line
b
c
b
aacommand@prompt  # two a just before the prompt
Run Code Online (Sandbox Code Playgroud)


问题:据我所知,--separator=a定义a标志着字符串内部的中断,而不是newline. 这是正确的吗?

我已经用其他字符串尝试了更多的输入,结果却一团糟。其他选项都工作得很好,我想:如果我使用tac --before我首先得到大约五个而不是一个空行,但是这就是应该发生的事情,对吧?

Gil*_*il' 9

tac在它主要设计用于的情况下更容易理解,即当分隔符是记录终止符时,即分隔符出现在最后一条记录之后。它以相反的顺序打印记录(包括每个终止符)。

$ echo -n fooabara | tac -s a; echo
rabafooa
Run Code Online (Sandbox Code Playgroud)

输入由三个记录(foo,br)组成,每条记录后跟分隔符a;输出由三个记录(rbfoo)组成,每条记录后跟分隔符a

如果最后一条记录没有以记录终止符结尾,它仍然首先打印,没有记录分隔符。

$ echo -n fooabar | tac -s a; echo
rbafooa
Run Code Online (Sandbox Code Playgroud)

最后一条记录r与倒数第二条记录连接在一起,b中间没有分隔符,因为最后一条记录的末尾没有分隔符。

由于换行符,您的输入看起来有点混乱。让我们用逗号而不是换行符来看看它:

$ echo -n a,b,c,b,a, | tac -s a; echo
,,b,c,b,aa
Run Code Online (Sandbox Code Playgroud)

有三个输入记录:一个空的(有一个终止符a),一个大的,,b,c,b,(同样有一个终止符)和一个未,终止的记录。这些记录(每条记录都带有终止符,最后一条没有终止符的记录除外)以相反的顺序打印。

您的困惑可能来自期望“分隔符”是分隔符——但这是用词不当:它实际上是一个记录终止符。--before使其成为发起者。