PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : unerklärliche Ausgabe von sed?



mpw
30-12-2009, 02:06
Hallo,

habe follgenden Codeschnipsel:



echo $1
echo $2
echo $dir
echo "=="
neu=`echo $dir|sed -e s#$1#$2#g`
echo $neu


und die Ausgabe ist:



.
/home/mpw/testbilder2
./audi_klein
==
/home/mpw/testbilder2/home/mpw/testbilder2/home/mpw/testbilder2/home/mpw/testbilder2/home/mpw/testbilder2/home/mpw/testbilder2/home/mpw/testbilder2/home/mpw/testbilder2/home/mpw/testbilder2/home/mpw/testbilder2/home/mpw/testbilder2/home/mpw/testbilder2


Denk ich falsch oder was ist los? Meiner Meinung nach muss herauskommen:



.
/home/mpw/testbilder2
./audi_klein
==
/home/mpw/testbilder2/audi_klein


Was habe ich falsch geamcht? Verstehe echt die Welt nicht mehr, warum kopiert der den Pfad so oft hintereinader?

Danke für Tipps.

Gruß
MPW

mpw
30-12-2009, 02:20
Hab's nochmal weiter getestet. Der spinnt doch völlig.

Hatte befürchtet, da der Teil in einer Schleife hängt, dass da iwo noch eingepfuscht wird, aber dem ist nicht so. Der arbeitet anscheinend wirklich so.

Habe ein neues Skript zum testen gemacht:



eins="."
zwei="/home/mpw/testbilder"
dir="./audi_klein"
neu=`echo $dir | sed -e s#\$eins#\$zwei#g`
echo $neu


ergibt



/home/mpw/testbilder/home/mpw/testbilder/home/mpw/testbilder/home/mpw/testbilder/home/mpw/testbilder/home/mpw/testbilder/home/mpw/testbilder/home/mpw/testbilder/home/mpw/testbilder/home/mpw/testbilder/home/mpw/testbilder/home/mpw/testbilder


Warum kommt nicht



/home/mpw/testbilder/audi_klein

raus?

Ich begreif's echt nicht...

Gruß
MPW

jeebee
30-12-2009, 10:54
Das Problem ist folgendes:
#.#blubb# matcht ein beliebiges Zeichen (.) und ersetzt es mit blubb. Wenn du das nun global machst, wird jedes Zeichen deines Inputstrings mit 'blubb' ersetzt. Das kannst du verhindern indem du '\.' verwendest um nur einen . zu matchen.

mpw
30-12-2009, 16:25
Danke, jeebee.

Hatte echt schon an mir selbst gezweifelt.

D.h. ist sollte dann vorher pauschal in $1 alle . durch \. ersetzen.

Quasi dann


iwas='echo $1|sed -e s#\.#\\\.#g'


und dann $iwas statt $1?

Werde ich nachher mal probieren.

Danke für den Tipp.

Gruß
MPW

msi
31-12-2009, 00:04
nutz besser
mkdir ${dir//$1/$2}
das ist dann ein direkter string replcae ohne reguläre ausdrücke, welche du auch nicht brauchst.

mpw
01-01-2010, 17:18
Hi,

danke für den Tipp. Das sieht sehr einfach und elegant aus.

Habe zwar das andere schon ans Laufen bekommen, aber werde das auch mal testen.

offtopic: Gibt's hier eigentlich im Forum die Möglichkeit ein Thema als gelöst zu markieren?

Gruß
MPW