Entkommen mehrerer Backticks in einem Sed-Anruf

8

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?

Fragenüberlauf
quelle
Können Sie weitere Details zu Ihrem Skript bereitstellen? Wie ordnen Sie $searchund zu $replacement?
Cuonglm
@Gnouc, die Such- und Ersetzungszeichenfolgen werden aus einer Zuordnungsliste extrahiert ähnlich wie diesen
Frage Überlauf

Antworten:

10

Um die Flucht auf ein Minimum zu reduzieren, schlage ich vor, einfache Anführungszeichen mit sedwie in zu verwenden

sed 's/pattern/repl/g'

(In einfachen Anführungszeichen können Sie den Backtick frei und ohne Angst und ohne Flucht verwenden).
Wenn Sie im sedSkript eine Shell-Variable verwenden müssen , 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 besser als die folgende Verkettung gesehen werden

's/aaa' + "${var}" + 'ccc/some' + "${thing}" + 'else/g'
Enzotib
quelle
Ja, das ist richtig. Die Klammern lösten es. Vielen Dank!
Fragenüberlauf
Ich habe versucht, einfache Anführungszeichen zu verwenden, aber das (verursacht ein Problem. Müssen aber immer noch den Backticks entkommen.
Fragenüberlauf
@QuestionOverflow: sedWenn Sie in GNU die -rOption verwenden, werden die runden Klammern für die Gruppierung verwendet. Verwenden Sie also keine -rOption oder alternativ \(für runde Klammern.
Enzotib