![Экранирование нескольких обратных кавычек в вызове sed](https://rvso.com/image/36421/%D0%AD%D0%BA%D1%80%D0%B0%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%B8%D1%85%20%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D1%8B%D1%85%20%D0%BA%D0%B0%D0%B2%D1%8B%D1%87%D0%B5%D0%BA%20%D0%B2%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%D0%B5%20sed.png)
Мне необходимо выполнить поиск и замену итеративно в нескольких операторах 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'