web-dev-qa-db-fra.com

Explication de tac - avant

-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?

12
SantaXL

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
23
Stephen Kitt

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.

5
poige