
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 -- Dieter Klünter | Systemberatung sip: 7770535@sipgate.de http://www.dpunkt.de/buecher/2104.html GPG Key ID:8EF7B6C6 -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org

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 -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org

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:
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. ;)
Danke, das hilft schon mal um damit weiterzuarbeiten. -Dieter -- Dieter Klünter | Systemberatung sip: 7770535@sipgate.de http://www.dpunkt.de/buecher/2104.html GPG Key ID:8EF7B6C6 -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org

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 -- Need professional modperl support? Hire me! (http://foertsch.name) Like fantasy? http://kabatinte.net -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org

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 -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org

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 -- Dieter Klünter | Systemberatung sip: 7770535@sipgate.de http://www.dpunkt.de/buecher/2104.html GPG Key ID:8EF7B6C6 -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org

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 -- Double your drive space -- delete Windows! -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
participants (4)
-
David Haller
-
Detlef Reichelt
-
Dieter Kluenter
-
Torsten Förtsch