bash: for in über datei

Lesenswerte Artikel, Anleitungen und Diskussionen
theomega
Userprojekt
Userprojekt
Posts: 704
Joined: 2003-01-27 14:36

bash: for in über datei

Post by theomega » 2006-11-14 19:27

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

User avatar
Joe User
Project Manager
Project Manager
Posts: 11578
Joined: 2003-02-27 01:00
Location: Hamburg

Re: bash: for in über datei

Post by Joe User » 2006-11-14 19:47

Ich habe zwar nicht ganz verstanden was Du möchtest, aber Deine sed's lassen sich zusammenfassen:

Code: Select all

sed 's/^(.*)$/"1"/g'
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

theomega
Userprojekt
Userprojekt
Posts: 704
Joined: 2003-01-27 14:36

Re: bash: for in über datei

Post by theomega » 2006-11-14 19:49

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?

User avatar
Joe User
Project Manager
Project Manager
Posts: 11578
Joined: 2003-02-27 01:00
Location: Hamburg

Re: bash: for in über datei

Post by Joe User » 2006-11-14 19:55

PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

theomega
Userprojekt
Userprojekt
Posts: 704
Joined: 2003-01-27 14:36

Re: bash: for in über datei

Post by theomega » 2006-11-14 21:08

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

User avatar
Joe User
Project Manager
Project Manager
Posts: 11578
Joined: 2003-02-27 01:00
Location: Hamburg

Re: bash: for in über datei

Post by Joe User » 2006-11-14 21:24

PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

flo
RSAC
Posts: 2297
Joined: 2002-07-28 13:02
Location: Berlin

Re: bash: for in über datei

Post by flo » 2006-11-14 22:30

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.

lucki2
Posts: 427
Joined: 2006-10-03 01:31

Re: bash: for in über datei

Post by lucki2 » 2006-11-20 00:05

$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