ritschmanhard: Bash Problem mit Quotas und regulärem Ausdruck (sed)

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

  1. 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

  2. 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!

    --
    Never argue with an idiot. He will lower you to his level and then
    beat you with experience.