it-swarm.com.de

Wie man eine komplette Zeile in einer 'for'-Schleife mit Leerzeichen liest

Ich versuche, eine for -Schleife für die Datei auszuführen und möchte die gesamte Zeile anzeigen. Stattdessen wird nur das letzte Wort angezeigt. Ich möchte die komplette Linie.

for j in `cat ./file_wget_med`

do
echo $j

done

ergebnis nach dem Lauf:

Found.

Hier sind meine Daten:

$ cat file_wget_med
2013-09-11 14:27:03 ERROR 404: Not Found.
122
user192118

for Die Schleife wird geteilt, wenn Leerzeichen wie Leerzeichen, Tabulatoren oder Zeilenumbrüche angezeigt werden. Verwenden Sie also IFS (Internal Field Separator) :

IFS=$'\n'       # make newlines the only separator
for j in $(cat ./file_wget_med)    
do
    echo "$j"
done
171
Radu Rădeanu

for Loops werden standardmäßig in Leerzeichen (Leerzeichen, Tabulator, Zeilenvorschub) aufgeteilt. Die einfachste Möglichkeit, an einer Zeile zu arbeiten, besteht darin, stattdessen eine while read -Schleife zu verwenden, die in Zeilenumbrüche aufgeteilt wird:

while read i; do echo "$i"; done < ./file_wget_med

Ich würde erwarte Ihren Befehl, ein Wort pro Zeile auszuspucken (das ist passiert, als ich es mit einer eigenen Datei ausprobiert habe). Wenn etwas anderes passiert, bin ich mir nicht sicher, was es verursachen könnte.

82
evilsoup
#!/bin/bash
files=`find <subdir> -name '*'`
while read -r fname; do
    echo $fname
done <<< "$files"

Geprüftes Arbeiten, nicht der eine Liner, den Sie wahrscheinlich wollen, aber es ist nicht möglich, dies elegant zu tun.

19
Mitchell Currie

Hier ist eine kleine Erweiterung von Mitchell Curries Antwort, die mir wegen der geringen Anzahl von Nebenwirkungen gefällt, bei denen es nicht erforderlich ist, eine Variable festzulegen:

#!/bin/bash
while read -r fname; do
    echo $fname
done <<< "`find <subdir>`"
5
Dandalf

Ich würde es so schreiben:

cat ./file_wget_med | while read -r j
do
    echo $j
done

da dies die geringsten Änderungen im ursprünglichen Skript erfordert (außer für die Lösung mit IFS, aber das Verhalten von bash wird nicht nur für diese Schleifensteuerungsanweisung geändert).

1
mik