Bash Problem mit Quotas und regulärem Ausdruck (sed)
ritschmanhard
- sonstiges
Hi Leute!
Ich hab mal wieder ein Problem ausgegraben, bei dem ich nicht weiterkomme:
Ich möchte einen sed Befehl ausführen, zunächst ein vereinfachtes Beispiel:
(1 Ziel:) sed -i 's%a[ ]+/b%c/d%' /root/test.txt
Wenn das nun so auf Konsole geschrieben wird, geht das auch.
Nun ist es so, dass ich aber aus einem Bash Script arbeite:
var1 enthält: a[ ]+/b
var2 enthält: c/d
wenn ich nun folgendes im Bash Script schreibe:
sed -i 's%${var1}%${var2}%' /tmp/test.txt
dann geht es nicht, weil dann die ausgeführte sed Zeile lautet (keine Variablenersetzung!):
(2) sed -i 's%${var1}%${var2}%' /tmp/test.txt
schreibe ich:
sed -i s%${var1}%${var2}% /tmp/test.txt
Dann wird (wunschgemäß) ${var1} und ${var2} durch deren Inhalt ersetzt, aber durch die fehlenden '' wird der sed Befehl ungültig, d.h. es wird folgende Zeile erzeugt:
(3) sed -i s%a[ ]+/b%c/d% /root/test.txt
Ich benötige aber (1) (mit ''), wie geht das aus dem Script?
Grüsse,
Richard
Hier noch das exakte Problem:
(1) sed -i 's%kernel[ ]+(hd0,4)/boot/vmlinuz[ ]+root=/dev/sda5[ ]+showopts[ ]+ide=nodma[ ]+apm=off[ ]+acpi=ht[ ]+vga=normal[ ]+noresume[ ]+selinux=0[ ]+barrier=off[ ]+iommu=noforce[ ]+3%kernel (hd0,4)/boot/vmlinuz root=/dev/sda5 showopts ide=nodma apm=off vga=normal noresume selinux=0 barrier=off iommu=noforce 3 acpi=ht%' /root/test.txt
Wenn das nun so auf Konsole geschrieben wird, geht das auch.
Nun ist es so, dass ich aber aus einem Bash Script arbeite:
var1 enthält:
kernel[ ]+(hd0,4)/boot/vmlinuz[ ]+root=/dev/sda5[ ]+showopts[ ]+ide=nodma[ ]+apm=off[ ]+acpi=ht[ ]+vga=normal[ ]+noresume[ ]+selinux=0[ ]+barrier=off[ ]+iommu=noforce[ ]+3
var2 enthält:
kernel (hd0,4)/boot/vmlinuz root=/dev/sda5 showopts ide=nodma apm=off vga=normal noresume selinux=0 barrier=off iommu=noforce 3 acpi=ht
wenn ich nun folgendes im Bash Script schreibe:
sed -i 's%${var1}%${var2}%' /tmp/test.txt
dann geht es nicht, weil dann der ausgeführte sed lautet:
(2) sed -i 's%${var1}%${var2}%' /tmp/test.txt
schreibe ich:
sed -i s%${var1}%${var2}% /tmp/test.txt
Dann wird (wunschgemäß) ${var1} und ${var2} durch deren Inhalt ersetzt, aber durch die fehlenden '' wird der sed Befehl ungültig, d.h. es wird folgende Zeile erzeugt:
(3) sed -i s%kernel[ ]+(hd0,4)/boot/vmlinuz[ ]+root=/dev/sda5[ ]+showopts[ ]+ide=nodma[ ]+apm=off[ ]+acpi=ht[ ]+vga=normal[ ]+noresume[ ]+selinux=0[ ]+barrier=off[ ]+iommu=noforce[ ]+3%kernel (hd0,4)/boot/vmlinuz root=/dev/sda5 showopts ide=nodma apm=off vga=normal noresume selinux=0 barrier=off iommu=noforce 3 acpi=ht% /root/test.txt
Hi!
Sorry, lasst euch von folgender Ungereimtheit nicht verwirren:
/root/test.txt
/tmp/test.txt
Es lautet stets auf /tmp/test.txt, als ersetzt bitte gedanklich /root/test.txt durch /tmp/test.txt
Sorry...
Grüße,
Richard
hi!
wenn ich nun folgendes im Bash Script schreibe:
sed -i 's%${var1}%${var2}%' /tmp/test.txt
dann geht es nicht, weil dann die ausgeführte sed Zeile lautet (keine
Variablenersetzung!):
Ist ja klar, weil deine Shell die '-Zeichen interpretiert -- und zwar als
Anweisung, im enthaltenen String alle Escapesequenzen zu ignorieren. Darum
musst du die '-Zeichen maskieren, damit alles wie gewuenscht durchgereicht
wird:
sed -i 's%${var1}%${var2}%' /tmp/test.txt
bye, Frank!