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

これを1つのステップで行うためのより詳細な方法があると確信していますが、手っ取り早い方法は、すべての{}を削除し、完了したらセット全体をラップすることです。

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 に答える