mysql - 提取两个变量并用sed重写多行

标签 mysql macos sed

我有一个包含各种使用和更新命令的大量查询文件。我想将 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/

相关文章:

mysql - 如果从另一台计算机单击按钮,如何禁用该按钮

ios - 我应该如何分发供应用程序开发人员使用的 OSX 框架?

regex - 当前登录用户的 Sed $DISPLAY

php - 使用php将mysql中的数据打印到pdf文件中

mysql - Node js(Express js)Mysql读取ECONNRESET错误

MySQL:在另一个子查询中使用子查询结果

objective-c - 最小化/小型化 cocoa NSWindow 没有标题栏

android - ADT插件文件夹在哪里?

regex - Shell 脚本 - sed 不起作用

linux - 在文件中多次替换单词之间的字符串