Text-Processing

tac 命令的選項會產生奇怪的輸出comprehensionquestionC這米pr和H和ns一世這nq你和s噸一世這ncomprehension question

  • August 13, 2013

假設我有這個文件,除了

a
b
c
b
a

tac --separator=a file在 BASH 中使用

$$ on a Debian based Linux $$,我明白了:

                 # empty line
                 # empty line
b
c
b
aacommand@prompt  # two a just before the prompt

問題:據我了解,--separator=a定義a標記字元串內的中斷,而不是newline. 這是正確的嗎?

我已經嘗試過使用其他字元串進行更多輸入,但結果非常混亂。其他選項都工作得很好,我想:如果我使用tac --before我首先得到大約 5 比 1 的空行,但這就是應該發生的事情,對吧?

tac在它主要設計的情況下更容易理解,即分隔符是記錄終止符,即分隔符出現在最後一條記錄之後。它以相反的順序列印記錄(包括每個終止符)。

$ echo -n fooabara | tac -s a; echo
rabafooa

輸入由三個記錄(foob)組成r,每個記錄後跟分隔符a;輸出由三個記錄(rb)組成foo,每個記錄後跟分隔符a

如果最後一條記錄沒有以記錄終止符結尾,它仍然首先列印,沒有記錄分隔符。

$ echo -n fooabar | tac -s a; echo
rbafooa

最後一條記錄與倒數第二r條記錄連接在一起,b中間沒有分隔符,因為最後一條記錄的末尾沒有分隔符。

由於換行符,您的輸入看起來有點混亂。讓我們用逗號而不是換行符來查看它:

$ echo -n a,b,c,b,a, | tac -s a; echo
,,b,c,b,aa

有三個輸入記錄:一個空的(帶有一個終止符a),一個龐大的,,b,c,b,(同樣帶有一個終止符),和一個未終止,的結尾。這些記錄(每個記錄都有其終結符,除了沒有終結符的最後一條記錄)以相反的順序列印。

您的困惑可能來自於期望“分隔符”是分隔符——但這是用詞不當:它實際上是一個記錄終結者。--before而是讓它成為發起者。

引用自:https://unix.stackexchange.com/questions/73600