Page 1 of 1

bash: for in über datei

Posted: 2006-11-14 19:27
by theomega
Hallo Leute,
ich muss in einem Bash-Script eine Datei Zeilenweise abarbeiten:

dabei verwende ich folgenden Code:

Code: Select all

 for monthdata in `cat datei | sed "s/^/"/" | sed "s/$/"/"  `; do
 done
Das problem an der Schleife ist: Sie wird nicht für jede Zeile einmal aufgerufen sondern für jedes Wort in der Datei, das heißt als Trennzeichen wird ein Leerzeichen und nicht der Zeilenumbruch verwendet.

Wie kann man das vermeiden bzw umschiffen? Ich habe schon wie ihr seht versucht jede Zeile in Anführungszeichen zu setzten, was leider auch nichts bringt.

Danke
TO

Re: bash: for in über datei

Posted: 2006-11-14 19:47
by Joe User
Ich habe zwar nicht ganz verstanden was Du möchtest, aber Deine sed's lassen sich zusammenfassen:

Code: Select all

sed 's/^(.*)$/"1"/g'

Re: bash: for in über datei

Posted: 2006-11-14 19:49
by theomega
Oki, dann nochmal ausführlich:
Nehmen wir an in der Datei steht drin:

Code: Select all

Dies ist Zeile 1
Und dies ist Zeile 2
Dann hätte ich gerne, dass das Schleifeninnere genau zweimal aufgerufen wird, einmal mit $monthdata="Dies ist Zeile 1" und einmal mit $monthdata="Und dies ist Zeile 2". Was aber mit o.a. Code passiert ist: Die Schleife wird für jedes Wort einmal aufgerufen. Ich erhalte also zuerst $monthdata="Dies", dann $monthdata="ist" usw.

Versteht es jetzt jemand?

Re: bash: for in über datei

Posted: 2006-11-14 19:55
by Joe User

Re: bash: for in über datei

Posted: 2006-11-14 21:08
by theomega
Ich hatte natürlich auch bei Google gesucht und nichts gefunden, der von dir verlinkte Tipp bezieht sich nur auf das Einlesen von der Tastatur nicht aber aus einer Datei. Die manpage zu "read" sagt mir das gleiche.

Dank dir trotzdem
TO

Re: bash: for in über datei

Posted: 2006-11-14 21:24
by Joe User

Re: bash: for in über datei

Posted: 2006-11-14 22:30
by flo
Ist das nicht wurscht, so stdin herkommt? :-)

Code: Select all

cat test.txt | while read line; do echo $line; done
while read line; do echo $line; done < test.txt
geht beides

flo.

Re: bash: for in über datei

Posted: 2006-11-20 00:05
by lucki2
$IFS auf n setzen.
ohne:

Code: Select all

~$ a=`echo -e "a bcn d en"`
~$ for i in $a ; do echo $i ; done
a
bc
d
e
mit:

Code: Select all

~$ a=`echo -e "a bcn d en"`
~$ IFS="n"
~$ for i in $a ; do echo $i ; done
a bc
 d e
~$
das ist was Du brauchst.

bzw Dein Problem:

Code: Select all

IFS="n" ; for monthdata in `cat datei` ; do echo $monthdata ; done ; unset IFS