[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Bash: "\" am Zeilenende



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


Reply to: