Danke @shiro für den Hinweis mit -z.
Wie muss dann das Muster aussehen, das sich über mehrer Zeilen erstreckt, damit es in der Datei $d gefunden wird? Vielleicht so?:
Zeile1\0Zeile2\0Zeile3
–––––––––––––––––––––––––––––––––––––––––––––––––––––
Danke @kB für den Hinweis mit "/". Das habe ich übersehen.
–––––––––––––––––––––––––––––––––––––––––––––––––––––
@user_unknown:
Um etwas mehr Information zu geben:
In der Datei $d kann irgendetwas sein. Eine beliebige Kombination von Sonderzeichen, Text und Befehlen. Der Inhalt ändert sich natürlich immer wieder, je nachdem, auf welche Datei $d zeigt.
Und $b ist eben das, was in der Datei $d entfernt werden soll. $b ist also in der Datei $d vorhanden.
In $line ist das, was dann in die Variable $b geht. Der Zeilenumbruch wird mit \n gemacht.
In $b können unter Umständen auch nicht geschlossene geschweifte Klammern drin stehen. Das soll verdeutlichen, dass eben in $b wie auch in der Datei $d, wie auch in $line jeder denkbare Inhalt vorkommen dürfen soll.
Es wäre praktisch, wenn es einen Befehl geben würde, der eine beliebige Zeichenkette so auf sed vorbereitet, dass sed keine Probleme mit dem Inhalt mehr hat.
Einen Befehl, der errät, was man vorhat und sich dann selbst hinschreibt - ja, das wäre praktisch, würde einem aber die Erfolgserlebnisse rauben, die man hat, wenn man es selbst hinbekommt.
Durch Try and Error habe ich jetzt herausgefunden, dass ich nur folgendes escapen muss damit der Befehl ...
a=$(sed ":a;N;\$!ba;s/$b//g" "$d")
... zuverlässig funktioniert:
Nämlich nur: [, ], * ,/, \ und sonst nichts. Ich zweifle aber noch etwas, ob ich durch try und error wirklich alles gefunden habe.
Frage: Habe ich?
(Der Befehl "a=$(sed ":a;N;\$!ba;s/$b//g" "$d")" funktioniert dann zuverlässig, wenn er das Muster so modifiziert wurde, dass der sed Befehl nicht gestört wird und ordnungsgemäss funktioniert. Und wenn durch die Modifizierung des Musters das Muster nicht so verändert wurde, dass es nicht mehr in der Datei $d gefunden wird, obwohl es dort eigentlich vorhanden wäre.)