我需要在几个 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
脚本中使用 shell 变量,请将单引号和双引号放在一起,如下例所示
var="bbb"
thing=foo
sed 's/aaa'"${var}"'ccc/some'"${thing}"'else/g'
可以更好地将其视为以下串联
's/aaa' + "${var}" + 'ccc/some' + "${thing}" + 'else/g'