Ich habe eine Datei mit dem Namen, /tmp/urlFile
in der jede Zeile eine URL darstellt. Ich versuche aus der Datei wie folgt zu lesen:
cat "/tmp/urlFile" | while read url
do
echo $url
done
Wenn die letzte Zeile nicht mit einem Zeilenumbruchzeichen endet, wird diese Zeile nicht gelesen. Ich habe mich gefragt warum?
Ist es möglich, alle Zeilen zu lesen, unabhängig davon, ob sie mit einer neuen Zeile enden oder nicht?
awk 1 /tmp/urlFile
.. soawk 1 /tmp/urlFile | while ...
Antworten:
Du würdest tun:
(Diese Schleife fügt effektiv die fehlende neue Zeile in der letzten (Nicht-) Zeile zurück.)
Siehe auch:
quelle
printf
Aufrufe hier haben\n
.Dies scheint teilweise gelöst zu sein mit
readarray -t
:Beachten Sie jedoch, dass dies zwar für Dateien mit angemessener Größe funktioniert, diese Lösung jedoch ein potenziell neues Problem bei sehr großen Dateien mit sich bringt. Sie liest die Datei zunächst in ein Array, das dann durchlaufen werden muss. Bei sehr großen Dateien kann dies sowohl zeit- als auch speicherintensiv sein, möglicherweise bis zum Ausfall.
quelle
Per Definition besteht eine Textdatei aus einer Folge von Zeilen. Eine Zeile endet mit einem Zeilenumbruch. Daher endet eine Textdatei mit einem Zeilenumbruch, sofern sie nicht leer ist.
Das
read
eingebaute Gerät dient nur zum Lesen von Textdateien. Sie übergeben keine Textdatei und können daher nicht hoffen, dass sie nahtlos funktioniert. Die Shell liest alle Zeilen - was sie überspringt, sind die zusätzlichen Zeichen nach der letzten Zeile.Wenn Sie eine möglicherweise fehlerhafte Eingabedatei haben, in der möglicherweise die letzte Zeile fehlt, können Sie zur Sicherheit eine neue Zeile hinzufügen.
Dateien, bei denen es sich um Textdateien handeln sollte, denen jedoch der letzte Zeilenumbruch fehlt, werden häufig von Windows-Editoren erstellt. Dies erfolgt normalerweise in Kombination mit Windows-Zeilenenden, bei denen es sich im Gegensatz zu Unix LF um CR LF handelt. CR-Zeichen sind selten nützlich und können auf keinen Fall in URLs angezeigt werden. Sie sollten sie daher entfernen.
Wenn die Eingabedatei wohlgeformt ist und mit einer neuen
echo
Zeile endet, wird eine zusätzliche leere Zeile hinzugefügt . Da URLs nicht leer sein dürfen, ignorieren Sie einfach leere Zeilen.Beachten Sie auch, dass
read
Zeilen nicht einfach gelesen werden. Es ignoriert führende und nachfolgende Leerzeichen, was für eine URL wahrscheinlich wünschenswert ist. Backslash am Ende einer Zeile wird als Escape-Zeichen behandelt, wodurch die nächste Zeile mit der ersten minus der Backslash-Newline-Sequenz verbunden wird, was definitiv nicht wünschenswert ist. Sie sollten also die-r
Option an übergebenread
. Es ist sehr, sehr selten, dassread
man eher das Richtige ist alsread -r
.quelle
Nun,
read
gibt einen falsy Wert , wenn es am Ende der Datei , bevor eine neue Zeile trifft, aber selbst wenn es der Fall ist, weist es immer noch den Wert , den es zu lesen. Wir können also überprüfen, ob der letzte Aufruf vonread
etwas anderes als eine leere Zeile zurückgibt, und es wie gewohnt verarbeiten. Verlassen Sie die Schleife also erst, nachdemread
false zurückgegeben wurde und die Zeile leer ist:quelle
Ein anderer Weg wäre wie folgt:
Von hier verwiesen .
quelle
Dies ist eine nutzlose Verwendung von
cat
.Ironischerweise können Sie den
cat
Prozess hier durch etwas wirklich Nützliches ersetzen : ein Tool, über das POSIX-Systeme verfügen, um die fehlende neue Zeile hinzuzufügen und die Datei in eine richtige POSIX-Textdatei zu verwandeln.Weiterführende Literatur
quelle
read
in diesen Fällen das Verhalten von angegeben wird.