On Sunday, August 29, 2010 13:16:02 Detlef Reichelt wrote:
#!/bin/bash
cat db.txt | while read i; do
name=`echo $i | awk '{ print $1 }'` pw=`echo $i | awk '{ print $2 }'` mail=`echo $i | awk '{ print $3 }'` echo $name " -> " $pw " -> " $mail sed -e "s|%NAME%|$name|g" template.txt > $name.txt sed -i -e "s|%PW%|$pw|g" $name.txt sed -i -e "s|%MAIL%|$mail|g" $name.txt
done
Also, wenn Du sowas professionell machst, könnte man Dich als einen der Schuldigen an der globalen Erwärmung bezeichnen. Schuldigung, das musste raus.
Für mich wäre die simpelste Version irgendwas mit Perl, z.B:
perl -e ' my $tmpl; { local $/; local @ARGV=("tmpl"); $tmpl=<>; } my %x; while(<>) { @x{qw/NAME PW MAIL/}=split; (my $x=$tmpl)=~s/%(\w+?)%/$x{$1}/g; my $f; open $f, ">", "$x{NAME}.txt" and print $f $x } ' user
Der besseren Lesbarkeit wegen habe ich es eingerückt. Es könnte aber auch alles in einer Zeile geschrieben werden.
Mit awk sind ähnlich einfache Versionen möglich.
Aber bei obigem Shell-Skript fehlen mir die Worte, ehrlich.
Das cat am Anfang kann weggelassen werden:
while read i; do ... done <db.txt
Dann kann man die echo- und awk-Prozesse einsparen. Das kann das read-Kommando genauso gut:
while read name pw mail; do ... done <db.txt
Wenn in den Zeilen noch mehr Spalten enthalten sind, d.h. wenn es einen Rest gibt, schreibt man es eben so:
while read name pw mail dummy; do ... done <db.txt
Weiterhin kann man aus den 3 sed-Prozessen einen machen:
sed "s/%NAME%/$name/g;s/%MAIL%/$mail/g;s/%PW%/$pw/g" template >"$name".txt
Insgesamt ergibt sich also:
while read name pw mail dummy; do sed "s/%NAME%/$name/g;s/%MAIL%/$mail/g;s/%PW%/$pw/g" template >"$name".txt done <db.txt
Das spart pro Schleifendurchlauf 11 Prozesse ein plus den cat-Prozess.
Torsten Förtsch