Hallo, ich stehe heute auf dem Schlauch, folgendes Problem: - eine Userdatei mit 3 Spalten und n Zeilen - eine Textdatei mit Standardtext Es sollen nun aus der Userdatei die drei Variablen pro Zeile in die Textdatei eingefügt werden, als output werden dann n Textdateien erstellt.
Die Userdatei hat folgende Struktur franz geheim franz@domain.com frieder secret frieder@domain.org
Kann mir jemand auf die Sprünge helfen und einen kleinen Denkansatz liefern.
-Dieter
Moin Dieter,
Am Sun, 29 Aug 2010 12:24:08 +0200 schrieb "Dieter Kluenter" dieter@dkluenter.de:
ich stehe heute auf dem Schlauch, folgendes Problem:
- eine Userdatei mit 3 Spalten und n Zeilen
- eine Textdatei mit Standardtext
Es sollen nun aus der Userdatei die drei Variablen pro Zeile in die Textdatei eingefügt werden, als output werden dann n Textdateien erstellt.
nen schneller Denkanstoß:
3 Dateien:
1. db.txt -> enthält die Daten fritz geheim fritz@web.de klaus passwort klaus@gmx.de monika baum monika@t-online.de willi maja willi@1und1.de
2. template.txt -> enthält den Standardtext Hallo %NAME%,
deine Mailaddy lautet: %MAIL% Passwort: %PW%
Gruß und Kuss dein Julius
3. text.sh -> Das Skript #!/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
Liest aus der db.txt name/pw/mail und erstellt ein $name.txt in der die Variablen ersetzt werden. Kann man bestimmt eleganter lösen, aber das viel mir jetzt so auf die schnelle ein. ;)
Detlef
Detlef Reichelt detlef@die-mafia.de writes:
Moin Dieter,
Am Sun, 29 Aug 2010 12:24:08 +0200 schrieb "Dieter Kluenter" dieter@dkluenter.de:
ich stehe heute auf dem Schlauch, folgendes Problem:
- eine Userdatei mit 3 Spalten und n Zeilen
- eine Textdatei mit Standardtext
Es sollen nun aus der Userdatei die drei Variablen pro Zeile in die Textdatei eingefügt werden, als output werden dann n Textdateien erstellt.
nen schneller Denkanstoß:
3 Dateien:
- db.txt -> enthält die Daten
fritz geheim fritz@web.de klaus passwort klaus@gmx.de monika baum monika@t-online.de willi maja willi@1und1.de
- template.txt -> enthält den Standardtext
Hallo %NAME%,
deine Mailaddy lautet: %MAIL% Passwort: %PW%
Gruß und Kuss dein Julius
- text.sh -> Das Skript
#!/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
Liest aus der db.txt name/pw/mail und erstellt ein $name.txt in der die Variablen ersetzt werden. Kann man bestimmt eleganter lösen, aber das viel mir jetzt so auf die schnelle ein. ;)
Danke, das hilft schon mal um damit weiterzuarbeiten.
-Dieter
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
Moin Torsten,
Am Sun, 29 Aug 2010 14:32:13 +0200 schrieb Torsten Förtsch torsten.foertsch@gmx.net:
Aber bei obigem Shell-Skript fehlen mir die Worte, ehrlich.
Nicht gut geschlafen?
Hier ging es um einen einfachen Denkanstoß, nicht um ein professionelles Skript. Und Denkanstöße sollten meiner Meinung nach in erster Linie gut lesbar und nachvollziehbar sein.
Detlef
Detlef Reichelt detlef@die-mafia.de writes:
Moin Torsten,
Am Sun, 29 Aug 2010 14:32:13 +0200 schrieb Torsten Förtsch torsten.foertsch@gmx.net:
Aber bei obigem Shell-Skript fehlen mir die Worte, ehrlich.
Nicht gut geschlafen?
Hier ging es um einen einfachen Denkanstoß, nicht um ein professionelles Skript. Und Denkanstöße sollten meiner Meinung nach in erster Linie gut lesbar und nachvollziehbar sein.
Einerseits hat Torsten sicherlich Recht, wenn er sagt, mit Perl ist so etwas einfacher zu lösen. Anderseits muss ich Detlef zustimmen, es ging mir um einen Denkanstoß, und dazu war die Vorlage sehr hilfreich. Ein bischen Ahnung habe ich ja, so dass ich auch in der Lage war, Optimierungen vorzunehmen. Danke euch beiden für die Anregungen.
-Dieter
Hallo,
Am Son, 29 Aug 2010, Detlef Reichelt schrieb:
Am Sun, 29 Aug 2010 14:32:13 +0200 schrieb Torsten Förtsch torsten.foertsch@gmx.net:
Aber bei obigem Shell-Skript fehlen mir die Worte, ehrlich.
Nicht gut geschlafen?
Hier ging es um einen einfachen Denkanstoß, nicht um ein professionelles Skript. Und Denkanstöße sollten meiner Meinung nach in erster Linie gut lesbar und nachvollziehbar sein.
Das geht auch mit Torstens Lösung. Und ich stimm ihm zu.
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
(Andere Formatierungen, oder auch z.B.:
sed \ -e "s/%NAME%/$name/g;" \ -e "s/%MAIL%/$mail/g;" \ -e "s/%PW%/$pw/g;" \ template > "${name}.txt"
sind auch möglich.
HTH, -dnh