Überspringen Sie leere Zeilen beim Durchlaufen Datei Zeile für Zeile
Ich bin das Durchlaufen einer Datei Zeile für Zeile und jedes Wort in ein array, und das klappt. Aber es nimmt auch leere Zeilen und legt es als ein Element im array, wie kann ich das überspringen von leeren Zeilen?
Beispiel-Datei
Line 1
line 2
line 3
line 4
line 5
line 6
Mein code
while read line ; do
myarray[$index]="$line"
index=$(($index+1))
done < $inputfile
Möglich psuedo-code
while read line ; do
if (line != space);then
myarray[$index]="$line"
fi
index=$(($index+1))
done < $inputfile
Du musst angemeldet sein, um einen Kommentar abzugeben.
Entfernen der leeren Zeilen zunächst mit
sed
.Elegant:
cat
zugrep
? Würde nichtgrep -v "^$" "$inputfile"
genauso gut?$file
sollte wirklich in doppelten Anführungszeichen hier. Es gibt keine Garantie, die mit dem Namen nicht mit Leerzeichen.$inputfile
?cat ... | grep
sind in der Regel als widersprüchlich (da "elegant" ist selbst subjektiv);cat
zugrep
ist in der Regel als schlechte form. Wenn Sie wollen, um das Ziel zu erreichen, einfach setzen Sie die input-Datei zuerst, das gleiche kann erreicht werden ohne die extra-Prozess über< "$file" grep "pattern..." | cmd | ...
echo "\na\nb\n\nc"
ist wahrscheinlich verwirrend in diesem Beispiel, wieecho
nicht verarbeitet steuerzeichen standardmäßig (aber es hängt davon ab, welcheecho
Sie verwenden: die shell-built-in oder ein in den$PATH
); da reden wirbash
, ein besseres Beispiel wäre:printf '\na\nb\n\nc' | grep -v '^$'
(oder gleichwertig... | grep '.'
Durchführung des gleichen Tests wie in Ihrem pseudo-code:
Den
-z
test bedeutettrue if empty
.!
negiert (also "true", wenn nicht leer).Können Sie auch Ausdrücke verwenden, wie
[ "x$line" = x ]
odertest "x$line" = x
um zu testen, ob die Zeile leer ist.Jedoch jede Zeile enthält Leerzeichen nicht werden als leer. Wenn das ein problem darstellt, können Sie
sed
entfernen Sie diese Zeilen aus der Eingabe (auch leere Zeilen), bevor Sie übergeben werden, um diewhile
loop, wie in:if [ "$line" ]; then
test "x$line" = x
form für max. die Portabilität.sed -e '/^[ \t]*$/d' -e 's/^[ \t]*//'
zu löschen, leeren oder alle whitespace-Zeichen-Zeilen und entfernen Sie alle führenden whitespace-Zeichen vor dem nicht-whitespace-Zeichen in eine Zeile.sed
Teil, du wirst sehen, es macht das richtige.echo $line
und du wirst sehen. Ich glaube, dein problem ist, dassmyarray
ist lokal für die Schleife und nicht sichtbar außerhalb der Schleife.cat -b -s file |grep -v '^$'
Ich weiß, es ist gelöst, aber, ich brauchte, um die Ausgabe von nummerierten Zeilen und ignorieren leere Zeilen, so dachte ich, kann man es gleich hier, falls jemand es braucht. 🙂
cat
(das formatiert die Ausgabe mehr, als man normalerweise haben will),grep
können auch Zeilennummern hinzufügen. Ob passend zu jeder Zeile, keine Nummern übersprungen werden: z.B.grep -v '^$' file | grep -n .
(Sie können konvertieren Sie die Doppelpunkt (:
), um etwas anderes übersed
)Verwenden Sie grep zum entfernen der leeren Zeilen:
cat
zugrep
? Würde nichtgrep -v "^$" "$inputfile"
genauso gut?Diese version ist sehr schnell im Vergleich zu Lösungen, aufrufen von externen Befehle wie
sed
undgrep
. Auch er überspringt Zeilen, die nur Leerzeichen, die Zeilen müssen nicht leer sein, werden übersprungen.