我有一个包含各种使用和更新命令的大量查询文件。我想将 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 文件被完全清除了。对我做错了什么有什么建议吗?
最佳答案
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
的行应该匹配但没有匹配,这可能会更容易发现。诚然,正则表达式看起来确实有点脆弱,但希望输入格式足够严格。
关于mysql - 提取两个变量并用sed重写多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51678567/