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

mspsb9vt  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(372)

我有一个包含各种使用和更新命令的大型查询文件。我想换衣服 updateinsert...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文件被完全删除。关于我做错了什么有什么建议吗?

ha5z0ras

ha5z0ras1#

在这个过程中有两个问题 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 本来应该匹配的,但我没有。诚然,regex看起来确实有点脆弱,但希望输入格式足够严格。

相关问题