Мне необходимо выполнить поиск и замену итеративно в нескольких операторах SQL:
От:
CREATE TABLE `Old_Name` (
К:
ALTER TABLE `Old_Name` RENAME TO `New_Name`
Запрос выше содержит обратные кавычки `
. Я попробовал сделать следующее
sed -i -r "s/CREATE TABLE \`$search\` \(/ALTER TABLE \`$search\` RENAME TO \`$replacement\`/g" /query.txt;
Вместо этого он создает ввод в командной строке. Но если я добавлю пробел после $replacement
, он запустится нормально. Но мне не нужен пробел после New_Name
.
Обратите внимание, я не знаю, вызвано ли это на самом деле обратными кавычками или это может быть проблема интерполяции имени переменной. Независимо от случая, как я могу решить эту проблему?
решение1
Чтобы свести экранирование к минимуму, я предлагаю использовать одинарные кавычки с sed
, как в
sed 's/pattern/repl/g'
(в одинарных кавычках вы можете свободно использовать обратные кавычки без всякого страха и без экранирования).
Если вам нужно использовать переменную оболочки в sed
скрипте, объедините одинарные и двойные кавычки, как в следующем примере
var="bbb"
thing=foo
sed 's/aaa'"${var}"'ccc/some'"${thing}"'else/g'
это можно было бы лучше рассматривать как следующую конкатенацию
's/aaa' + "${var}" + 'ccc/some' + "${thing}" + 'else/g'