On Fri, Jun 03, 2011 at 07:47:06PM +0200, Klaus Becker wrote: > Le vendredi 03 juin 2011 18:36:15, Jochen Schulz a écrit : > > Klaus Becker: > > > ich will aus einem Text per Skript Ordner anlegen. Die Textdatei sieht > > > schematisch so aus: > > > > > > text1/ text2 / text3 :\ > > > text1/ text2 / text4 > > > > Immer genau drei Spalten? Ist das Leerzeichen hinter "text2" Absicht? > > Sind die Datei-/Verzeichnisnamen immer alphanumerisch? Bestimmt der > > Slash am Ende eines Namens, ob eine Datei oder ein Verzeichnis angelegt > > werden soll, oder wird das durch die Position innerhalb der Zeile > > bestimmt? > > > > Davon ausgehend, dass die Position relevant ist, das Leerzeichen ein > > Fehler ist und immer nur drei Namen pro Zeile stehen: > > > > awk ' { print $1, $2, $3 } ' $datei | while read dir1, dir2, file; do > > mkdir -p "$dir1" "$dir2" > > touch $file > > done > > > > J. > > > Ich gab' mal die ganze Geschichte durch, der Text ist auf französich, aber das > spielt ja keine Rolle. Das Leerzeichen ist also kein Fehler. Eine Lösung ohne > awk wäre mir lieber, da ich awk nicht beherrsche, und es sicher ander > Möglichkeiten gibt. > > cat liste.txt > Une_souris_verte > Qui courait dans l'herbe > Je l'attrape par la queue,/ Je la montre à ces messieurs / Ces messieurs me > disent :\ > Je l'attrape par la queue,/ Je la montre à ces messieurs /Trempez-la dans > l'huile, > Je l'attrape par la queue,/ Je la montre à ces messieurs /Trempez-la dans > l"eau, > Je l'attrape par la queue,/ Je la montre à ces messieurs /Ça fera un > escargot > Un peu chaud; echo Tout chaud. > Pas très chaud"; echo Tout chaud.." > Vraiment pas très chaud'; echo Tout chaud...' > ./Froi\d\" $(echo Tout chaud)....\" > > 4 Zeilen enthalten "/", die Worte am Anfang der nächsten Zeile gehören zu der > Zeile darüber. > > > Das angestrebte Resultat ist in > > http://dl.free.fr/rey033voa > > Ohne die Leerzeichen und das "\" geht folgende Lösung: > > while read line; do > mkdir -p `dirname $line` > touch $line > done <list.txt Ich hab mir das angestrebte Ergebnis nicht angeschaut. Vielleicht nimmst bei der nächsten Gelegenheit auf deutschen Listen auch deutsche Website? ;) Regular Expressions sind, was du im Grunde brauchst. Sehr aufgedröselt wäre mit sed folgendes denkbar: sed -e 's|:\\||' -e 's|,||g' -e 's|/ |/|' -e 's| /|/|' -e 's|/ |/|' list.txt Ich weiß nicht, ob du sed kennst... Ganz kurz: jedes -e leitet einen "Ausdruck" ein; im Ausdruck heißt das s, dass du suchen und dann ersetzen willst; es wird gesucht, was zwischen dem ersten und zweiten | steht; es wird ersetzt mit dem, was zwischen dem zweiten und dritten | steht. Dann kommst ein bisschen escapen und ein g für globale (mehrmals auf der Zeile) hinzu. Was du rauskriegst, ist: Je l'attrape par la queue/Je la montre à ces messieurs/Ces messieurs me disent Je l'attrape par la queue/Je la montre à ces messieurs/Trempez-la dans l'huile Je l'attrape par la queue/Je la montre à ces messieurs/Trempez-la dans l"eau Je l'attrape par la queue/Je la montre à ces messieurs/Ça fera un escargot Und dann kannst du darüber rennen. In etwa for file in $(sed ... ); do \ mkdir -p $(dirname "$file"); \ touch "$file"; \ done Ist das, was du suchst? Hauke -- .''`. Jan Hauke Rahm <jhr@debian.org> www.jhr-online.de : :' : Debian Developer www.debian.org `. `'` Member of the Linux Foundation www.linux.com `- Fellow of the Free Software Foundation Europe www.fsfe.org
Attachment:
signature.asc
Description: Digital signature