Script, Strings trennen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Mel
Beiträge: 40
Registriert: 28.09.2004 20:39:45
Wohnort: Bonn
Kontaktdaten:

Script, Strings trennen

Beitrag von Mel » 15.04.2005 17:31:27

Hallo Leute,

ich habe eine Menge Dateien, die ich alle derselben Prozedur unterziehen möchte. Die Dateinamen sehen alle so aus:

"Vorname Nachname - Das ist der Titel.txt"

Ausgeführt werden soll dann der folgende Befehl:

Code: Alles auswählen

makelrf -a "Vorname Nachname" -t "Das ist der Titel" -o Vorname\ Nachname\ \-\ Das\ ist\ der\ Titel.lrf Vorname\ Nachname\ \-\ Das\ ist\ der\ Titel.txt
Ein Beispiel:

Code: Alles auswählen

makelrf -a "William Shakespeare" -t "Romeo und Julia" -o William\ Shakespeare\ \-\ Romeo\ und\ Julia.lrf William\ Shakespeare\ \-\ Romeo\ und\ Julia.txt
Ich müsste also den String "V N - D i d T" am " - " aufsplitten und jeweils beide Teile in Variablen speichern. Wie kann ich das am geschicktesten machen? Eigentlich sollte es nicht besonders schwer sein, nur stehe ich irgendwie auf dem Schlauch...

Dank und Gruss,
Mel.

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 15.04.2005 17:47:49

bash-Syntax!

Code: Alles auswählen

$ A="Alan Smithee - Foobar and his daugther"
$ echo ${A#* - }
Foobar and his daugher
$ echo ${A% - *}
Alan Smithee

Benutzeravatar
godsmacker
Beiträge: 902
Registriert: 16.03.2003 21:50:26
Lizenz eigener Beiträge: Artistic Lizenz
Wohnort: Chemnitz
Kontaktdaten:

Beitrag von godsmacker » 15.04.2005 17:52:24

Joghurt hat geschrieben:bash-Syntax!

Code: Alles auswählen

$ A="Alan Smithee - Foobar and his daugther"
$ echo ${A#* - }
Foobar and his daugher
$ echo ${A% - *}
Alan Smithee
Impliziert allerdings, dass sonst keine Bindestringe vorkommen.

Benutzeravatar
Mel
Beiträge: 40
Registriert: 28.09.2004 20:39:45
Wohnort: Bonn
Kontaktdaten:

Beitrag von Mel » 15.04.2005 17:56:25

godsmacker hat geschrieben: Impliziert allerdings, dass sonst keine Bindestringe vorkommen.
Daran hatte ich selbst noch nicht gedacht - es gibt tatsächlich Dateien, in denen mehrere "-" vorkommen. Ich müsste am jeweils ersten splitten, so dass in der zweiten Variablen dann etwas wie "Romeo und Julia - Englisch" stehen sollte....

Benutzeravatar
meandtheshell
Beiträge: 4054
Registriert: 14.01.2005 17:51:30

Beitrag von meandtheshell » 15.04.2005 17:58:05

@ godsmacker
Die Dateinamen sehen alle so aus:

"Vorname Nachname - Das ist der Titel.txt"
so ist es spezifiziert - also ist das was jog. vorgeschlagen hat in ordnung

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 15.04.2005 18:16:07

Dann so:

Code: Alles auswählen

TITEL=${FILENAME#* - }
AUTOR=${FILENAME% - $TITEL}

Benutzeravatar
Mel
Beiträge: 40
Registriert: 28.09.2004 20:39:45
Wohnort: Bonn
Kontaktdaten:

Beitrag von Mel » 15.04.2005 18:29:49

Danke schon einmal für Eure Hilfe! Ich weiss immernoch nicht ganz, wie ich es anstellen soll:

Code: Alles auswählen

for i in `ls William\ Shakespeare\ \-\ Romeo\ und\ Julia.txt`; do TITEL=${i#* - };AUTOR=${i% - $TITEL};echo TITEL $TITEL;echo AUTOR $AUTOR;done;
TITEL William
AUTOR William
TITEL Shakespeare
AUTOR Shakespeare
TITEL -
AUTOR -
TITEL Romeo
AUTOR Romeo
TITEL und
AUTOR und
TITEL Julia.txt
AUTOR Julia.txt
Die for-Schleife escapet die Leerzeichen nicht. Besser wäre sicher find, aber ich weiss nicht genau, wie ich Variablen in den find Befehl einbauen kann.

Ausserdem habe ich immernoch das Problem, dass in $TITEL am Ende noch das ".txt" weggeschnitten werden müsste...

Gruss und Dank,
Mel.

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 15.04.2005 18:43:26

Die eleganteste Möglichkeit ist es, read zu verwenden (die andere möglichkeit wäre

Code: Alles auswählen

IFS="
"
gewesen)

Code: Alles auswählen

ls | while read FILENAME; do 
  TITEL=...
  AUTOR=...
  #.txt abschneiden
  TITEL=${TITEL%.txt}
   ...
done

Benutzeravatar
Mel
Beiträge: 40
Registriert: 28.09.2004 20:39:45
Wohnort: Bonn
Kontaktdaten:

Beitrag von Mel » 15.04.2005 21:19:48

Tausend Dank, es funktioniert!

Code: Alles auswählen

ls|while read FILENAME; 
do TITEL=${FILENAME#* - };AUTOR=${FILENAME% - $TITEL};TITEL=${TITEL%.txt};
makelrf -x "/home/mel/librie/makelrf3/info.xml" -a " $AUTOR " -t " $TITEL " -o "$AUTOR - $TITEL".lrf "$FILENAME";
done;
Aber es ist schon gut, zu wissen, dass es meist an einem selbst liegt, wenn man nicht vorwärtskommt :-)

Gruss,
Mel.

Antworten