wc -l
zählt keine Zeilen.
Ja, diese Antwort kommt vielleicht etwas spät, aber ich habe bisher noch niemanden gefunden, der eine robustere Lösung dokumentiert hat.
Entgegen der landläufigen Meinung erfordert POSIX nicht, dass Dateien überhaupt mit einem Zeilenumbruchzeichen enden. Ja, die Definition einer POSIX 3.206 Zeile lautet wie folgt:
Eine Sequenz von null oder mehr non- Zeichen plus einem terminierenden Zeichen.
Was jedoch vielen nicht bewusst ist, ist dass POSIX auch eine POSIX 3.195 Unvollständige Zeile definiert:
Eine Sequenz von einem oder mehr non- Zeichen am Ende der Datei.
Daher sind Dateien ohne abschließendes LF
durchaus POSIX-konform.
Wenn Sie sich entscheiden, beide EOF-Typen nicht zu unterstützen, ist Ihr Programm nicht POSIX-konform.
Als Beispiel, schauen wir uns die folgende Datei an.
1 Dies ist die erste Zeile.
2 Dies ist die zweite Zeile.
Unabhängig vom EOF sind Sie sicher, dass es zwei Zeilen gibt. Sie haben das herausgefunden, indem Sie geschaut haben, wie viele Zeilen begonnen haben, nicht indem Sie geschaut haben, wie viele Zeilen beendet wurden. Mit anderen Worten, gemäß POSIX haben diese beiden Dateien beide die gleiche Anzahl von Zeilen:
1 Dies ist die erste Zeile.\n
2 Dies ist die zweite Zeile.\n
1 Dies ist die erste Zeile.\n
2 Dies ist die zweite Zeile.
Die Man-Page ist relativ klar darüber, dass wc
Zeilenumbrüche zählt, wobei ein Zeilenumbruch einfach ein 0x0a
Zeichen ist:
NAME
wc - Ausgabe von Zeilenzahl, Wortzahl und Byteanzahl für jede Datei
Demnach versucht wc
nicht einmal zu zählen, was man vielleicht eine "Zeile" nennen würde. Die Verwendung von wc
zum Zählen von Zeilen kann je nach EOF Ihrer Eingabedatei gut zu Fehlzählungen führen.
POSIX-konforme Lösung
Sie können grep
verwenden, um Zeilen wie im obigen Beispiel zu zählen. Diese Lösung ist sowohl robuster als auch genauer und sie unterstützt alle verschiedenen Varianten davon, was eine Zeile in Ihrer Datei sein könnte: