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
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
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: ``'''
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
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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.