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:
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?
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
:
Beachten Sie, dass dies viel schneller ist als Lösungen, die auf externen Quellen basieren.
Hut-Tipp zu Gordon Davisson zur Verbesserung der Schleifenlogik.
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%Dies ist mehr oder weniger eine Kombination der bisher gegebenen Antworten.
Es ändert die Dateien nicht an Ort und Stelle.
%Vor% 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.