-b, --antes
O separador é anexado ao início do registro que precede no arquivo.
E não consigo entender a seguinte saída:
$ echo -e "Hello\nNew\nWorld\n!" > file
$ tac file
!
World
New
Hello
$ tac -b file
!
World
NewHello
Por que não há nova linha entre New
e Hello
?
tac
trabalha com registros e seus separadores, anexados , por padrão, após o registro correspondente. Isso é um pouco contra-intuitivo em comparação com outras ferramentas baseadas em registros (como o AWK), onde os separadores são desanexados.Com
-b
, os registros, com sua nova linha anexada, são os seguintes (na ordem original):Hello
\nNew
\nWorld
\n!
\n
Saída ao contrário, isso se torna
que corresponde à saída que você vê.
Sem
-b
, os registros, com sua nova linha anexada, são os seguintes:Hello\n
New\n
World\n
!\n
Saída ao contrário, isso se torna
Isso parece estranho, em parte devido
tac
a trabalhos de maneira um tanto contra-intuitiva quanto a mim. Vamos usar separadores claramente visíveis — vírgulas.O que eu esperaria ver como resultado do seguinte comando:
?
Bem, eu vejo como há A separado de B separado de C. Assim (concluo) sendo impresso ao contrário, eles devem constituir
C,B,A
. Vamos checar. Infelizmente, ele imprime de maneira diferente:Podemos concluir
tac
a colocação dos separadores originais:A
ainda tem depois, assim comoB
tem, masC
não tinha e, portanto, é impresso como está.O que acontece se eu correr
tac
com-b
esse tempo?Aparentemente, funciona assim para
-b
: está passando pela entrada na direção inversa até encontrar um separador. Como é encontrado, está impresso:,
. Em seguida, imprime o texto que pulou durante a pesquisa:C
. Então o ciclo se repete:,B
. Como não há separadores restantes, apenas o restante é impresso:A
.De acordo com a explicação que dei acima
New
, estaria em uma nova linha porque foi prefixado com new-line, mas comoHello
não estava - seria impresso como está.