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

时间:2018-08-03 18:53:47

标签: 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文件被完全清除了。关于我做错了什么建议吗?

1 个答案:

答案 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行不匹配,这可能会更容易发现。诚然,正则表达式确实看起来有些脆弱,但是希望输入格式足够严格。