-b, --avant
Le séparateur est attaché au début de l'enregistrement qu'il précède dans le fichier.
Et je ne peux pas comprendre la sortie suivante:
$ echo -e "Hello\nNew\nWorld\n!" > file
$ tac file
!
World
New
Hello
$ tac -b file
!
World
NewHello
Pourquoi n'y a-t-il pas de nouvelle ligne entre New
et Hello
?
tac
fonctionne avec les enregistrements et leurs séparateurs, attaché, par défaut après l'enregistrement correspondant. Ceci est quelque peu contre-intuitif par rapport à d'autres outils basés sur des enregistrements (tels que AWK) où les séparateurs sont détachés.
Avec -b
, les enregistrements, avec leur nouvelle ligne attachée, sont les suivants (dans l'ordre d'origine):
Hello
\nNew
\nWorld
\n!
\n
Sortie en sens inverse, cela devient
\n\n!\nWorld\nNewHello
ce qui correspond à la sortie que vous voyez.
Sans pour autant -b
, les enregistrements, avec leur nouvelle ligne attachée, sont les suivants:
Hello\n
New\n
World\n
!\n
Sortie en sens inverse, cela devient
!\nWorld\nNew\nHello\n
Cela semble étrange en partie parce que tac
fonctionne de manière quelque peu contre-intuitive pour moi. Utilisons des séparateurs clairement visibles - des virgules.
Que dois-je m'attendre à voir comme le résultat de la commande suivante:
% echo -ne 'A,B,C' | tac -s,
?
Eh bien, je le vois car il y a A séparé de B séparé de C. Ainsi (je conclus) étant imprimés à l'envers, ils devraient constituer C,B,A
. Allons vérifier. Hélas, il imprime différemment à la place:
% echo -ne 'A,B,C' | tac -s,
CB,A,
Nous pouvons conclure tac
sticks pour le placement des séparateurs d'origine: A
l'a toujours après, ainsi que B
, mais C
ne l'a pas et il est donc imprimé tel quel.
Que se passe-t-il si j'exécute tac
avec -b
cette fois?
% echo -ne 'A,B,C' | tac -bs,
,C,BA
Apparemment, cela fonctionne de cette façon pour -b
: il passe par l'entrée vers l'arrière jusqu'à ce qu'il trouve un séparateur. Comme il est trouvé, il est imprimé:
,
. Il imprime ensuite le texte ignoré lors de la recherche:
C
. Ensuite, le cycle se répète:
,B
. Comme il n'y a plus de séparateurs, le reste est imprimé:
A
.
Pourquoi n'y a-t-il pas de nouvelle ligne entre New et Hello?
Selon l'explication que j'ai donnée ci-dessus, New
serait sur une nouvelle ligne car elle était préfixée par new-line, mais puisque Hello
ne l'était pas - elle serait imprimée telle quelle.