Woher kommt der letzte Zeilenumbruch im Ergebnis dieses Sed?


7

Ich lerne die verschiedenen Befehle von sed und habe einige Experimente durchgeführt. Der Befehl, den ich versuche, ist:

root:[~]# seq 7 | sed -n '1~2H; 2~2{G;p}'
2

1
4

1
3
6

1
3
5
root:[~]#

Ich habe den Befehl analysiert und für mich sollte das letzte Zeilenumbruchzeichen nach der Nummer 5nicht existieren. Unten ist meine Analyse.

Geben Sie hier die Bildbeschreibung ein

Basierend auf meiner Analyse sollte die Ausgabe die Zellen mit dem roten Hintergrund sein. Wie Sie sehen können, gibt es kein letztes Zeilenumbruchzeichen. Wo irre ich mich Danke im Voraus.


1
Ich sehe keinen Zeilenumbruch als letztes Zeichen. Hast du den falschen Screenshot eingefügt?
Eblock

1
Wenn es keine neue Zeile gibt, sollte die letzte Zeile wie "5root: [~] #" aussehen
Nur ein Lernender

1
Sie können überprüfen, indem Sie Ihre seqauf 8 erhöhen . Sie werden sehen, dass es nach 5 keine neue Zeile gibt.
eblock

3
Ihr Textbild ist nicht sehr hilfreich . Es kann nicht in einen Editor kopiert werden und ist nicht sehr gut indiziert, was bedeutet, dass andere Benutzer mit demselben Problem hier weniger wahrscheinlich die Antwort finden. Bitte bearbeiten Sie Ihren Beitrag, um den relevanten Text direkt aufzunehmen (vorzugsweise mit Kopieren + Einfügen, um Transkriptionsfehler zu vermeiden).
Toby Speight

2
Etwas ist unter UNIX keine Textzeile, es sei denn, es endet mit einer neuen Zeile. Im Gegensatz zu Windows, wo Zeilenumbrüche Zeilen trennen , beenden Zeilenumbrüche unter UNIX Zeilen, sodass Daten ohne Zeilenumbruch unter UNIX nicht Teil einer wohlgeformten Zeile in einer Textdatei sind. Dies erklärt das "Warum" hinter der von Ihnen gefundenen Spezifikation.
Charles Duffy

Antworten:


10

p fügt das Zeilenumbruchzeichen hinzu:

% printf 1 | sed 'p;s/1/2/'
1
2%

Wie zu sehen ist, 2wird das ohne nachgestellte Zeilenumbruch gedruckt, aber die 1 davor pist von.


5
Beachten Sie, dass der implizite Druck am Ende des Zyklus in einer Nicht-GNU sedmöglicherweise auch eine neue Zeile hinzufügt, selbst wenn die Eingabe keine neue Zeile enthält (eine nicht terminierte Zeile ist keine gültige Eingabe für den Standard sed).
Kusalananda

6

Ich glaube, ich habe die Antwort gefunden. In der Dokumentation des POSIX sed unter https://pubs.opengroup.org/onlinepubs/9699919799/utilities/sed.html heißt es:

Wenn der Musterbereich in die Standardausgabe oder eine benannte Datei geschrieben wird, folgt sed sofort eine neue Zeile.

Das bedeutet, dass der pBefehl immer sowohl den Musterbereich als auch eine neue Zeile druckt. Das erklärt auch , warum es Zeilenumbrüche nach 2\n\n1, 4\n\n1\n3und 6\n\n1\n3\n5.

Bitte korrigieren Sie mich, wenn Sie der Meinung sind, dass daran etwas nicht stimmt. Vielen Dank.


1
Genau. Das ist es.
Philippos
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.