PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : sed geht nicht im script, aber auf kommandozeile



meinereinerseiner
30-11-2001, 11:11
Hi,

ich habe meine Problem mit dem sed, das tut in meinem Script nicht.
Script 1 und 2 laufen nicht, 3 geht. Also hat das ganze doch etwas mit der verarbeitung der Variablen zu tun?
Lasse ich jeweils den sed string per echo ausgeben und führe den dann auf der kommandozeile aus, gehen alle 3.


Script 1:

#!/bin/sh
#
A="MERKEN86"
B="MERKEN87"
sed 's/\(.*\)$A\(.*\)/\1$B\2/g' listens-7867.ini > /tmp/d1.tmp ; cat /tmp/d1.tmp

Script 2:

#!/bin/sh
#
A="MERKEN86"
B="MERKEN87"
sed 's/\(.*\)${A}\(.*\)/\1${B}\2/g' listens-7867.ini > /tmp/d1.tmp ; cat /tmp/d1.tmp



Script 3:

#!/bin/sh
#
sed 's/\(.*\)MERKEN86\(.*\)/\1MERKEN87\2/g' listens-7867.ini > /tmp/d1.tmp ; cat /tmp/d1.tmp



was ist denn da querch?

der tom

thommy
30-11-2001, 11:47
Durch die einfachen Hochkommata wird die Expansion durch die Shell verhindert, d.h. im Sed-Befehlsstring werden $A und $B nicht expandiert.

Ausweg: die Sed-Befehlszeichenkette "außerhalb" basteln:

Beispiel:

befehl='\'s/\(.*\)'$A'\(.*\)/\1'$B'\2/g\''
sed $befehl listens...

Beachte genau die Lage der Hochkommata! Sie enden vor der durch die Shell zu ersetzenden Variablen und starten unmittelbar danach, sodass die Bash die enthaltenen Zeichen 1:1 übernimmt. Und \' expandiert zu '...

(ich habe den Befehlsstring nicht überprüft, aber das Prinzip sollte damit klar sein)

Thomas

thommy
30-11-2001, 11:49
Nachtrag: Wenn $A und $B Leerzeichen/Tabulatoren enthalten, muss die gesamte Zeichenkette nochmals in doppelte Anführungszeichen:

befehl="jetzt der String"

Thomas

meinereinerseiner
30-11-2001, 12:21
hmmm, das geht leider nicht, da bekomme ich ein: sed: -e expression #1, char 1: Unknown command: ``'''

thommy
30-11-2001, 12:33
Bin jetzt leider im falschen System, sodass ich das nicht prüfen kann.

Schreibe einmal 'set -x' an den Anfang Deines Skripts und schau Dir genau an, ob die korrekte Zeichenkette an 'befehl' zugewiesen wird bzw. wie der Aufruf von 'sed' tatsächlich aussieht. Eventuell steckt ein kleiner Schreibfehler drin...

Thomas

meinereinerseiner
30-11-2001, 12:45
set -x
#!/bin/sh
#
A="MERKEN86"
B="MERKEN87"
BEFEHL='\'s/\(.*\)'$A'\(.*\)/\1'$B'\2/g\''
sed $befehl listens-7867.ini > /tmp/d1.tmp ; cat /tmp/d1.tmp


bringt:
+ ./1234.sh
++ A=MERKEN86
++ B=MERKEN87
./1234.sh: line 6: unexpected EOF while looking for matching `''
./1234.sh: line 8: syntax error: unexpected end of file

meinereinerseiner
30-11-2001, 13:09
hab die lösung:

sed "s/\(.*\)MERKEN86\(.*\)/\1MERKEN87\2/g" listens-7867.ini > /tmp/d1.tmp ; cat /tmp/d1.tmp


statt:

sed 's/\(.*\)MERKEN86\(.*\)/\1MERKEN87\2/g' listens-7867.ini > /tmp/d1.tmp ; cat /tmp/d1.tmp

funktioniert.

nochmal DANKE

thommy
30-11-2001, 13:10
Ist wohl mein Fehler :rolleyes:

Versuche es mal mit folgender Zeile:

BEFEHL=\''s/\(.*\)'$A'\(.*\)/\1'$B'\2/g'\'


Übrigens sagt diese Ausgabe schon, dass etwas mit den Hochkommata nicht stimmt:

./1234.sh: line 6: unexpected EOF while looking for matching `''


Hoffe, jetzt ist's korrekt.

Thomas