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

Re: Bash: "\" am Zeilenende



Le vendredi 03 juin 2011 20:23:58, Jan Hauke Rahm a écrit :
> 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
> > > 
...
> > 
> > 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


Hallo Hauke,

ich hab' die "aufgeräumte Version" in deinem nächsten Mail getestet, 
funktionniert in der Tat, danke !

Das muss ich mir erst mal zu Gemüte führen. Sed kenne ich schon ein bisschen, 
aber dein Skript ist schon recht kompliziert, es gibt sicher eine einfachere 
Lösung.

Das Ganze ist auf französisch, weil ich in Frankreich wohne und dort einem 
GNU/Linux-Verein angehöre.

schönen Abend noch

Klaus


Reply to: