我有一个庞大的查询文件,其中包含各种使用和更新命令。我想将update
更改为insert...on duplicate key update
。
query.sql文件示例:
use database;
UPDATE table
SET value = '{"courseAuthor":"Company","courseCode":"ABCD1234"}'
WHERE id = 12;
我可以在UPDATE table
上进行查找/替换,使其变为INSERT INTO table (id, value)
,但需要替换下两行,使其变为:
VALUES( 12, '{"courseAuthor":"Company","courseCode":"ABCD1234"}')
ON DUPLICATE KEY UPDATE value = '{"courseAuthor":"Company","courseCode":"ABCD1234"}';
我的命令如下
sed -Eni '' '/SET/ N; s|SET value = (.*) WHERE id = (.*);|VALUES (\2, \1)\\\nON DUPLICATE KEY UPDATE value = \1;|g' query.sql
我的问题是,当我在MacOS上运行此命令时,query.sql文件被完全清除了。关于我做错了什么建议吗?
答案 0 :(得分:1)
sed
脚本中存在几个问题。您已经使用-n
来禁止自动打印,但是在sed
脚本中没有任何指令可以打印任何内容,因此没有输出。使用-i
进行就地编辑只是清除了文件。您需要添加p
进行打印。
它也不匹配任何内容,因为您已经将输入的第二行读入了模式空间,但是试图匹配有换行符的空间。我已将替换为
\n
,并且得到了:
/SET/{N; s|SET value = (.*)\nWHERE id = (.*);|VALUES (\2, \1)\nON DUPLICATE KEY UPDATE value = \1;|p}
或:
/SET/{N; s|SET value = (.*)\nWHERE id = (.*);|VALUES (\2, \1)\nON DUPLICATE KEY UPDATE value = \1;|;p}
两者之间的区别是。成功替换后的前版画(仅)。即使行没有改变也要跟上。如果应该匹配的SET
行不匹配,这可能会更容易发现。诚然,正则表达式确实看起来有些脆弱,但是希望输入格式足够严格。