Ich muss die Suche und Ersetzung iterativ in mehreren SQL-Anweisungen durchführen:
Aus:
CREATE TABLE `Old_Name` (
Zu:
ALTER TABLE `Old_Name` RENAME TO `New_Name`
Die obige Abfrage enthält Backticks `
. Ich habe Folgendes versucht
sed -i -r "s/CREATE TABLE \`$search\` \(/ALTER TABLE \`$search\` RENAME TO \`$replacement\`/g" /query.txt;
Stattdessen wird in der Befehlszeile ein Enter erstellt. Wenn ich jedoch dahinter ein Leerzeichen einfüge $replacement
, wird es normal ausgeführt. Ich möchte jedoch kein Leerzeichen danach New_Name
.
Hinweis: Ich weiß nicht, ob dies tatsächlich durch die Backticks verursacht wird oder ob es sich um ein Problem bei der Interpolation von Variablennamen handeln könnte. Wie kann ich dieses Problem unabhängig vom Fall lösen?
Antwort1
Um das Escapen auf ein Minimum zu reduzieren, empfehle ich die Verwendung von einfachen Anführungszeichen sed
, wie in
sed 's/pattern/repl/g'
(in einfachen Anführungszeichen können Sie den Backtick ohne Angst und ohne Escapezeichen verwenden).
Wenn Sie Shell-Variablen im Skript verwenden müssen sed
, setzen Sie einfache und doppelte Anführungszeichen wie im folgenden Beispiel zusammen
var="bbb"
thing=foo
sed 's/aaa'"${var}"'ccc/some'"${thing}"'else/g'
das könnte man besser als die folgende Verkettung sehen
's/aaa' + "${var}" + 'ccc/some' + "${thing}" + 'else/g'