Respektiere die letzte Zeile, wenn sie beim Lesen nicht mit einem neuen Zeilenkürzel (\ n) beendet wird

8

Ich habe bemerkt, dass read niemals die letzte Zeile einer Datei liest, wenn sie nicht am Ende ein "newline" -Zeichen enthält. Dies ist verständlich, wenn man bedenkt, dass, solange es kein "Newline" -Zeichen in einer Datei gibt, es so ist, als ob es 0 Zeilen enthalten würde (was ziemlich schwer zu erkennen ist!). Sehen Sie zum Beispiel Folgendes:

%Vor%

Aber ...

%Vor%

Die Frage ist dann: wie kann ich mit solchen Situationen umgehen, wenn ich mit read Dateien bearbeite, die nicht von mir selbst erstellt oder modifiziert wurden und von denen ich nicht weiß, ob sie tatsächlich mit einer "Newline" enden? Zeichen?

    
michaelmeyer 27.01.2013, 05:11
quelle

5 Antworten

14

read liest tatsächlich eine nicht abgeschlossene Zeile in die zugewiesene Variable ( $REPLY standardmäßig). Es gibt auch in einer solchen Zeile false zurück, was nur "Ende der Datei" bedeutet; direkt mit seinem Rückgabewert in der klassischen while -Schleife überspringt somit diese letzte Zeile. Wenn Sie die Schleifenlogik ein wenig ändern, können Sie nicht beendete Dateien mit Zeilenende korrekt verarbeiten, ohne vorher eine Desinfektion durchführen zu müssen, mit read :

%Vor%

Beachten Sie, dass dies viel schneller ist als Lösungen, die auf externen Quellen basieren.

Hut-Tipp zu Gordon Davisson zur Verbesserung der Schleifenlogik.

    
kopischke 27.01.2013, 12:19
quelle
2

POSIX erfordert, dass jede Zeile in einer Datei am Ende ein Zeilenumbruchzeichen hat, um anzuzeigen, dass es sich um eine Zeile handelt. Aber diese Website bietet eine Lösung für genau das Szenario, das Sie beschreiben . Endprodukt ist dieses Chunklet.

%Vor%     
JakeGould 27.01.2013 05:16
quelle
1

Wenn Sie lesen müssen, versuchen Sie Folgendes:

%Vor%

als awk scheint Zeilen auch ohne das Zeilenumbruchzeichen

zu erkennen     
EJK 27.01.2013 05:22
quelle
1

Dies ist mehr oder weniger eine Kombination der bisher gegebenen Antworten.

Es ändert die Dateien nicht an Ort und Stelle.

%Vor%     
user123444555621 27.01.2013 10:32
quelle
0

Kürzere bash way :

Für die Verwendung der ganzen Datei, ohne sie zu ändern:

%Vor%

oder

%Vor%

Um zu testen, ob die Datei richtig beendet wurde, und sie bei Bedarf korrigieren:

%Vor%

Erklärt: Überspringe die Anzahl der Zeilen aus der $ Datei und zähle die führenden Zeichen: Muss 0 sein, wenn die letzte Zeile beendet wird.

Ein anderer Ansatz:

%Vor%

Erklärt: Suchen Sie nach dem letzten Zeichen in der Datei, wenn es sich nicht um eine neue Zeile handelt, wird der Zeilenzähler auf 0 gesetzt.

    
F. Hauri 27.01.2013 08:57
quelle

Tags und Links