0

我想改变

{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
4

2 回答 2

2

我确信有一种更详细的方法可以一步完成,但快速的“n 脏”方法是删除所有 {},并在完成后包装整个集合。

UPDATE table
SET column = CONCAT('{', REPLACE(REPLACE(column,'{',''),'}',''), '}')
WHERE column REGEXP '{.*{'
于 2012-06-30T14:24:18.147 回答
0

不幸的是,MySQL 不支持正则表达式中的反向引用(允许用括号对子表达式进行分组并在同一表达式中调用它们匹配的值)。您可以将 SELECT 查询的结果导出到文本文件(例如 CSV 格式)中,替换所有出现的

{(.*){(.*)}(.*)}

和:

\1\2\3

使用支持 Perl 正则表达式语法的文本编辑器,然后用修改后的行替换原始行。

注意这个查询:

UPDATE table
SET column = CONCAT('{', REPLACE(REPLACE(column,'{',''),'}',''), '}')
WHERE column REGEXP '{.*{'

只有在保证整个文本被一对大括号包裹的情况下才有效!

于 2012-06-30T15:11:18.370 回答