line luistert niet

Pagina: 1
Acties:
  • 29 views sinds 30-01-2008

  • AlterEgo
  • Registratie: Juli 2001
  • Niet online
test.txt:
code:
1
2
3
4
a
b c
d
e


bewerken met:
code:
1
2
3
4
#!/bin/bash
for line in `cat test.txt` ; do
  echo $line;
done


Output:
code:
1
2
3
4
5
a
b
c
d
e


Het lijkt erop dat de spatie wordt gezien als een newline.
Ik verwacht per regel een output, dus:
code:
1
2
3
4
a
b c
d
e


Hoe komt dit, en wat doe ik hieraan?
* AlterEgo heel dom voelt

[ Voor 3% gewijzigd door AlterEgo op 19-12-2004 14:02 . Reden: sloppy typo ]


  • frim
  • Registratie: Augustus 2001
  • Niet online
Je moet je separation character veranderen in een newline, dus:

IFS=$'\n'

dit kun je ook vinden met google


code:
1
2
3
4
5
#!/bin/bash
IFS=$'\n'
for line in `cat test.txt`; do
  echo $line
done

[ Voor 43% gewijzigd door frim op 19-12-2004 14:07 ]


  • _JGC_
  • Registratie: Juli 2000
  • Laatst online: 21:01
Het valt me al mee dat bash niet gewoon "test.txt" output, maar goed.

Blijkbaar leest bash gewoon je test.txt uit, en maakt ie er een for loopje van. De syntax van bash is nogal vergevend, als jij het volgende doet:
code:
1
2
3
4
for i in a b
c d; do
  echo $i
done

Krijg je gewoon a b c d elk op een lege regel

doe je dit:
code:
1
2
3
for i in a b c d; do
  echo $i
done


Krijg je gewoon exact hetzelfde. For is niet bedoeld om een lijntje te splitten. Als je regel voor regel wilt printen, kan je met head en tail spelen, of evt met perl het volgende doen:
code:
1
2
3
4
5
6
open(FILE, "test.txt")
@lines = <FILE>;
close(FILE);
foreach $line (@lines) {
  print $line, "\n";
}


Met head en tail zou je met wc -l test.txt het aantal lines uit kunnen lezen, dit in een for-loopje stoppen om vervolgens die dingen op te voeren aan head -n $i | tail -n 1.

  • AlterEgo
  • Registratie: Juli 2001
  • Niet online
Dank u beiden.

Frim,
als je weet waarnaar je moet zoeken, dan is het errug makkelijk te vinden :Y)

  • blaataaps
  • Registratie: Juli 2001
  • Niet online
Opgelost dus :)
En verder is dit een vaker voorkomend probleem/feature bij shellscripten, maar je moet net even weten waar je moet zoeken :)

  • Wilke
  • Registratie: December 2000
  • Laatst online: 19:25
Btw. waarom doen jullie dit allemaal zo moeilijk met separation chars en weet ik wat?

code:
1
2
3
while read line; do
  echo $line
done < bestand.txt


Werkt prima.

[ Voor 3% gewijzigd door Wilke op 19-12-2004 18:57 ]

Pagina: 1

Dit topic is gesloten.