Ich muss die Suche und Ersetzung iterativ in mehreren SQL-Anweisungen durchführen:
Von:
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 eine Eingabe in der Befehlszeile erstellt. Aber wenn ich ein Leerzeichen dahinter hinzufüge $replacement
, läuft es normal. Aber ich will den Raum danach nicht mehr New_Name
.
Beachten Sie, dass ich nicht weiß, ob dies tatsächlich durch die Backticks verursacht wird oder ob es sich um ein Interpolationsproblem mit Variablennamen handeln könnte. Wie kann ich dieses Problem unabhängig vom Fall lösen?
$search
und zu$replacement
?Antworten:
Um die Flucht auf ein Minimum zu reduzieren, schlage ich vor, einfache Anführungszeichen mit
sed
wie in zu verwenden(In einfachen Anführungszeichen können Sie den Backtick frei und ohne Angst und ohne Flucht verwenden).
Wenn Sie im
sed
Skript eine Shell-Variable verwenden müssen , setzen Sie einfache und doppelte Anführungszeichen wie im folgenden Beispiel zusammendas könnte besser als die folgende Verkettung gesehen werden
quelle
(
verursacht ein Problem. Müssen aber immer noch den Backticks entkommen.sed
Wenn Sie in GNU die-r
Option verwenden, werden die runden Klammern für die Gruppierung verwendet. Verwenden Sie also keine-r
Option oder alternativ\(
für runde Klammern.