Hallo Leute, Ich brauch mal eure Hilfe... Ich schreibe gerade ein Shellscript. Irgendwo dadrin muss ich bestimmte Teile eines Strings ersetzen, der in einer Variable steht: VAR3=`echo XXabXX | sed s/$VAR1/$VAR2/` das klappt auch. Aber nur, solange in dem String *keine* Schraegstriche vorkommen. Da die Strings aber Pfade sind. enthalten sie auch Schraegstriche... Wenn also so ein Slash z.B. in VAR2 steht (z.B. "cd/ef"), dann interpretiert der sed die (verstaendlicherweise ;-)) als seine "eigenen" slashes: VAR1="ab" VAR2="cd/ef" ubstituiert sieht das dann so aus: VAR3=`echo XXabXX | sed s/ab/cd/ef/` ed: -e expression #1, char 8: Unknown option to 's' Der slash in "cd/ef" muss also irgendwie maskiert werden... aber wie verdammt? Ich hab schon alles durchprobiert. Rauskommen soll: XXcd/efXX Die Strings einzeln in ' oder " verpackt. Den ganzen sed-Befehl in ' oder " gepackt. Ich habs mit allen Klammern probiert etc pp. Preisfrage: Wer weiss wies geht? Danke fuer eure Unterstuetzung Gruss -Marc -- +------------------------------------------------------------------+ | --> http://www.links2linux.de <-- Von Linux-Usern fuer Linux-User| | | +---Registered-Linux-User-#136487------------http://counter.li.org + --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
* Marc Schiffbauer schrieb am 23.Mai.2000:
Ich schreibe gerade ein Shellscript. Irgendwo dadrin muss ich bestimmte Teile eines Strings ersetzen, der in einer Variable steht:
VAR3=`echo XXabXX | sed s/$VAR1/$VAR2/`
das klappt auch. Aber nur, solange in dem String *keine* Schraegstriche vorkommen. Da die Strings aber Pfade sind. enthalten sie auch Schraegstriche...
Beim sed sind die / nicht zwingend vorgeschrieben, sie können durch irgendetwas anderes ersetzt werden, z.B durch | aber auch , wäre Möglich oder auch y. Aber das könnte auch in einem Pfad vorkommen. | zwar auch, ist aber unwahrscheinlicher. Lange Rede, kurzer Sinn, versuch es mal mit: VAR3=`echo XXabXX | sed 'sed s|$VAR1|$VAR2|'` Die ' müssen gesetzt werden, damit die Shell die | nicht als pipe interpretiert. Bernd -- ACK = ACKnowledge = Zustimmung | NAC = No ACknowledge = keine Zustimmung DAU = Dümmster Anzunehmender User | LOL = Laughing Out Loud = Lautes Lachen IIRC = If I Remember Correctly = Falls ich mich richtig erinnere OT = Off Topic = Am Thema (der Liste) vorbei |Zufallssignatur 11 --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
Hallo Bernd, Bernd Brodesser wrote:
* Marc Schiffbauer schrieb am 23.Mai.2000:
VAR3=`echo XXabXX | sed s/$VAR1/$VAR2/`
VAR3=`echo XXabXX | sed 'sed s|$VAR1|$VAR2|'`
Das funzt bei mir nicht. $ ./test.sh sed: -e expression #1, char 18: Unterminated `s' command Das dann naheliegende: VAR3=`echo /home/marc/test.sh | sed 's|$VAR1|$VAR2|'` mach gar nichts, was aber klappt ist: VAR3=`echo /home/marc/test.sh | sed "s|$VAR1|$VAR2|"` (Achso: bei mir ist VAR1=marc, VAR2=dh/bin ;) CU David -- 2 is a really odd prime... email: David@dhaller.de www: www.dhaller.de --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
Hallo David, * David Haller schrieb am 24.Mai.2000:
Bernd Brodesser wrote:
* Marc Schiffbauer schrieb am 23.Mai.2000:
VAR3=`echo XXabXX | sed s/$VAR1/$VAR2/`
VAR3=`echo XXabXX | sed 'sed s|$VAR1|$VAR2|'` ^^^^
Da war natürlich ein sed zuviel. Sorry.
mach gar nichts, was aber klappt ist:
VAR3=`echo /home/marc/test.sh | sed "s|$VAR1|$VAR2|"`
Hast Recht, Danke schön. Bernd -- Was ist quoten? Quoten ist das Zitieren aus einer mail, der man antwortet. Und wie macht man es richtig? Zitate werden mit "> " gekennzeichnet. Nicht mehr als nötig zitieren. Vor den Abschnitten das Zitat, auf das man sich bezieht, mit einer Zeile Abstand oben und unten. |Zufallssignatur 12 --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
bestimmte Teile eines Strings ersetzen, der in einer Variable steht:
VAR3=`echo XXabXX | sed s/$VAR1/$VAR2/`
das klappt auch. Aber nur, solange in dem String *keine* Schraegstriche vorkommen. Da die Strings aber Pfade sind. enthalten sie auch Schraegstriche...
Wenn also so ein Slash z.B. in VAR2 steht (z.B. "cd/ef"), dann interpretiert der sed die (verstaendlicherweise ;-)) als seine "eigenen" slashes:
VAR1="ab" VAR2="cd/ef"
substituiert sieht das dann so aus:
VAR3=`echo XXabXX | sed s/ab/cd/ef/`
sed: -e expression #1, char 8: Unknown option to 's'
Maskieren sollte mit \ gehen wobei mir der Rest des RA auch bisken schwammig vorkommt. Gugg ma hier - lecker URL fuer seders ;) http://www.cornerstonemag.com/sed/sed1line.txt --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
Hallo Marc, Marc Schiffbauer wrote:
Ich schreibe gerade ein Shellscript. Irgendwo dadrin muss ich bestimmte Teile eines Strings ersetzen, der in einer Variable steht:
VAR3=`echo XXabXX | sed s/$VAR1/$VAR2/`
das klappt auch. Aber nur, solange in dem String *keine* Schraegstriche vorkommen. Da die Strings aber Pfade sind. enthalten sie auch Schraegstriche...
Versuch mal: ===== Beisskante ===== # file: test.sh -- sed s mit / in Mustervariable? # # Wenn ein / vorkommt, dann wollen wie dieses in der Hilfsvariablen # VARTMP fuer sed geeignet maskieren VAR1=marc VAR2=dh/bin # VAR2=dh if echo $VAR2 | grep /; then VARTMP=`echo "$VAR2" | sed s/"\/"/'\\\\'"\/"/` else VARTMP="$VAR2" fi # echo "\$VARTMP=$VARTMP" VAR3=`echo /home/marc/test.sh | sed s/$VAR1/$VAR3/` echo "\$VAR3=$VAR3" unset VARTMP ===== Beisskante ===== CU David -- "DOS=HIGH ...I knew it was on something!" (UNIX user, while reading C:\CONFIG.SYS) email: David@dhaller.de www: www.dhaller.de --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
Hallo nochmal, David Haller wrote:
VAR1=marc VAR2=dh/bin # VAR2=dh
if echo $VAR2 | grep /; then VARTMP=`echo "$VAR2" | sed s/"\/"/'\\\\'"\/"/` else VARTMP="$VAR2" fi
# echo "\$VARTMP=$VARTMP"
VAR3=`echo /home/marc/test.sh | sed s/$VAR1/$VAR3/` echo "\$VAR3=$VAR3" unset VARTMP
Ich merke gerade, obiges ist nicht ganz korrekt (und geht kuerzer) und, um gleich ein paar Varianten zu testen, eine for-Schleife: ==== schnipp ==== VAR1=marc for VAR2 in "dh" "dh/bin" "dh/temp/test/bin"; do VARTMP=`echo "$VAR2" | sed s/"\/"/'\\\\'"\/"/g` VAR3=`echo /home/marc/test.sh | sed s/$VAR1/$VARTMP/` echo "\$VAR3 = $VAR3" done unset VARTMP ==== schnapp ==== CU David -- Who can possibly rule, if no one who wants to do it, can be allowed to? --- Douglas Adams, Hitchhiker's Guide to the Galaxy email: David@dhaller.de www: www.dhaller.de --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
Hallo Marc, Bernd, Liste, Und nocheinmal melde ich mich ;) Ich habe noch ein wenig experimentiert und Marc musste auch noch Leerzeichen ersetzen, wodurch meine Version (mal wieder) fehlschlug. Ich habe dabei in einem script 5 Funktionen definiert in denen jew. eine Ersetzungsmethode verwendet wurde, wobei ich unten nur eine "Prototyp-funktion" angebe (das script gibts ggfs. per PM) und dann (per Schleife ueber alle Funktionen) die Dauer gemessen. ==== snip ==== #!/bin/bash VAR1=usr DIR="/usr/src/linux/include/linux/*" # (386 Dateien) <methode>() { for VARIN in `ls -d $DIR`; do for VAR2 in "dh" "dh/bin" "dh/temp/test dir/bin" \ "dh/temp dir/test dir/bin"; do <Ersetzung> #echo "$VAROUT" done done } time <methode> exit 0 ==== snap ==== Folgende Methoden habe ich verwendet (jew. in der Zeile <Ersetzung>): 1. Eine Variante nur mit sed: VAROUT=`echo $VARIN | sed s/$VAR1/"$(echo "$(echo "$VAR2" | \ sed s/"\/"/'\\\\'"\/"/g)" | sed s/"\ "/'\\\\'"\ "/g)"/` => real 0m53.727s user 0m7.380s sys 0m9.700s 2. Eine leichte Variation von 1 die schneller sein sollte: VAROUT=`echo $VARIN | sed s/$VAR1/"$(echo "$VAR2" | \ sed -e s/"\/"/'\\\\'"\/"/g -e s/"\ "/'\\\\'"\ "/g)"/` => real 0m51.885s user 0m4.530s sys 0m10.980s Hmja, schon besser... 3. Ein sed durch eine Shellersetzung ersetzt: VAROUT=`echo $VARIN | sed s/$VAR1/"$(echo -e "${VAR2//\//\\\\/}" | \ sed s/"\ "/'\\\\'"\ "/g)"/` => real 0m52.139s user 0m4.890s sys 0m10.720s Hm. Die muss wegen dem "echo |" langsamer sein... 4. Bernd Brodesser's Variante VAROUT=`echo $VARIN | sed "s|$VAR1|$VAR2|"` => real 0m18.392s user 0m2.610s sys 0m3.610s Aber Hallo! Das ist schon besser ;) 5. Meine "finale" Version ganz ohne sed: VAROUT="${VARIN//$VAR1/$VAR2}" => real 0m0.312s user 0m0.270s sys 0m0.020s kaum schlagbar :) CU David -- Aber was ist JavaScript? Eine Sprache zum Ausspionieren fremder Daten und zum Nerven anderer Leute (etwa durch Pop-up-windows). (Boris Piwinger in de.comm.infosystems.www.browsers) email: David@dhaller.de www: www.dhaller.de --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
David Haller wrote:
Hallo Marc, Bernd, Liste,
Und nocheinmal melde ich mich ;)
Ich habe noch ein wenig experimentiert und Marc musste auch noch Leerzeichen ersetzen, wodurch meine Version (mal wieder) fehlschlug.
Ich habe dabei in einem script 5 Funktionen definiert in denen jew. eine Ersetzungsmethode verwendet wurde, wobei ich unten nur eine "Prototyp-funktion" angebe (das script gibts ggfs. per PM) und dann (per Schleife ueber alle Funktionen) die Dauer gemessen.
==== snip ==== #!/bin/bash VAR1=usr DIR="/usr/src/linux/include/linux/*" # (386 Dateien)
<methode>() { for VARIN in `ls -d $DIR`; do for VAR2 in "dh" "dh/bin" "dh/temp/test dir/bin" \ "dh/temp dir/test dir/bin"; do <Ersetzung> #echo "$VAROUT" done done }
time <methode> exit 0 ==== snap ====
Folgende Methoden habe ich verwendet (jew. in der Zeile <Ersetzung>):
1. Eine Variante nur mit sed:
VAROUT=`echo $VARIN | sed s/$VAR1/"$(echo "$(echo "$VAR2" | \ sed s/"\/"/'\\\\'"\/"/g)" | sed s/"\ "/'\\\\'"\ "/g)"/`
=> real 0m53.727s user 0m7.380s sys 0m9.700s
2. Eine leichte Variation von 1 die schneller sein sollte:
VAROUT=`echo $VARIN | sed s/$VAR1/"$(echo "$VAR2" | \ sed -e s/"\/"/'\\\\'"\/"/g -e s/"\ "/'\\\\'"\ "/g)"/`
=> real 0m51.885s user 0m4.530s sys 0m10.980s
Hmja, schon besser...
3. Ein sed durch eine Shellersetzung ersetzt:
VAROUT=`echo $VARIN | sed s/$VAR1/"$(echo -e "${VAR2//\//\\\\/}" | \ sed s/"\ "/'\\\\'"\ "/g)"/`
=> real 0m52.139s user 0m4.890s sys 0m10.720s
Hm. Die muss wegen dem "echo |" langsamer sein...
4. Bernd Brodesser's Variante
VAROUT=`echo $VARIN | sed "s|$VAR1|$VAR2|"`
=> real 0m18.392s user 0m2.610s sys 0m3.610s
Aber Hallo! Das ist schon besser ;)
5. Meine "finale" Version ganz ohne sed:
VAROUT="${VARIN//$VAR1/$VAR2}"
=> real 0m0.312s user 0m0.270s sys 0m0.020s
kaum schlagbar :)
Wie hast du die Zeit gemessen? Gruss -Marc -- +------------------------------------------------------------------+ | --> http://www.links2linux.de <-- Von Linux-Usern fuer Linux-User| | | +---Registered-Linux-User-#136487------------http://counter.li.org + --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
Hallo Marc, * Marc Schiffbauer schrieb am 25.Mai.2000:
David Haller wrote:
[73 unnötige Zeilen entsorgt. Bitte nicht so viel quoten]
=> real 0m0.312s user 0m0.270s sys 0m0.020s
kaum schlagbar :)
Wie hast du die Zeit gemessen?
Mit time <befehl> Bernd -- LILO funktioniert nicht? Hast Du /etc/lilo.conf verändert und vergessen, lilo aufzurufen? Ist Deine /boot-Partition unter der 1024 Zylindergrenze? Bei anderen LILO Problemen mal in der SDB nachschauen: http://localhost/doc/sdb/de/html/rb_bootdisk.html |Zufallssignatur 6 --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
* Marc Schiffbauer wrote:
Der slash in "cd/ef" muss also irgendwie maskiert werden... aber wie verdammt? Ich hab schon alles durchprobiert.
Preisfrage: Wer weiss wies geht?
Hallo nochmal, Ich habs jetz nochmal optimiert, indem ich Davids und Bernds Loesung kombiniert hab: In einer Zeile und mit maskieren: VAR1=marc VAR2="dh/bin" VAR3=`echo /home/marc/test.sh \ | sed s/$VAR1/$(echo "$VAR2" \ | sed s/"\/"/'\\\\'"\/"/g)/` echo "\$VAR3 = $VAR3" So klappt es echt super, danke Leute ;-)) Gruss -Marc -- +------------------------------------------------------------------+ | --> http://www.links2linux.de <-- Von Linux-Usern fuer Linux-User| | | +---Registered-Linux-User-#136487------------http://counter.li.org + --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
participants (4)
-
B.Brodesser@online-club.de
-
David@dhaller.de
-
harper@weihenstephan.org
-
marc.schiffbauer@links2linux.de