我想改变
{foo, {bar}, foobar}
到
{foo, bar, foobar}
匹配'{.*{'
的所有行。即删除除最外面的一对之外的所有花括号{和}。
这样做
mysql -h $H -u $U -p$P $DB -B -e "SELECT id FROM t WHERE col REGEXP '{.*{'" > bad.txt
选择需要此替换的所有行。如何快速进行这种替换?
我可以通过
来做update table set column = REPLACE(column,'{','');
然后恢复最多对
update table set column = REPLACE(column,'^','{');
update table set column = REPLACE(column,'$','}');
mysql> EXPLAIN UPDATE t SET col=REPLACE(REPLACE(REPLACE(REPLACE(col,'{{','{'),'}}','}'), ', {', ', '), '}, ', ', ');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UPDATE t SET col=REPLACE(REPLACE(REPLACE(REPLACE(' at line 1
答案 0 :(得分:2)
我确信有一个更详细的方法可以一步完成,但快速的方法是删除所有{}并在完成后将整个集合包裹起来。
UPDATE table
SET column = CONCAT('{', REPLACE(REPLACE(column,'{',''),'}',''), '}')
WHERE column REGEXP '{.*{'
答案 1 :(得分:0)
不幸的是,MySQL不支持正则表达式中的反向引用(允许使用括号对子表达式进行分组并在同一表达式中调用它们匹配的值)。 您可以将SELECT查询的结果导出为文本文件(例如CSV格式),替换所有出现的
{(.*){(.*)}(.*)}
使用:
\1\2\3
使用支持Perl正则表达式语法的文本编辑器,然后用修改后的行替换原始行。
注意这个查询:
UPDATE table
SET column = CONCAT('{', REPLACE(REPLACE(column,'{',''),'}',''), '}')
WHERE column REGEXP '{.*{'
只有在保证整个文本被一对括号包裹时才会起作用!