こんにちは。テスト用の Discourse インスタンスで、Drupal 7 フォーラムから移行したリンクを変換するために regexp_replace コマンドを pg コンソールで実行しようとしています。200万件近くの投稿には、Markdown に変換する必要がある Textile 形式のリンクがたくさんあります。以下を使用しています。
上記のテスターやテキストエディタでは正しく動作し、次のように変換されます。
Cqwertyuioy - Lasgfdf Sddgfdds (Dsajjsa Vsjsjk Osaskgkk Spfs) \"link\":http://www.youtube.com/watch?v=aQjkOmzQ8RT
次のように変換されます。
Cqwertyuioy - Lasgfdf Sddgfdds (Dsajjsa Vsjsjk Osaskgkk Spfs) [link](http://www.youtube.com/watch?v=aQjkOmzQ8RT)
しかし、Discourse の pg コンソールで次を実行すると:
update posts set raw = regexp_replace(raw, '\"(.*?)\"\\:(http\\S+?(?=\\W+(?:$|\\s))|http\\S+)', E'[\\\\1](\\\\2)', 'g');
次のようになります。
Cqwertyuioy - Lasgfdf Sddgfdds (Dsajjsa Vsjsjk Osaskgkk Spfs) [link](http:)//www.youtube.com/watch?v=aQjkOmzQ8RT
(匿名化してすみません。)したがって、重要な部分は次のとおりです。
- 正しい:
[link](http://www.youtube.com/watch?v=aQjkOmzQ8RT) - 間違っている:
[link](http:)//www.youtube.com/watch?v=aQjkOmzQ8RT
SQL クエリでのエスケープ文字の奇妙さや、[] と () の特殊関数とリテラルの違いに関係していると思いますが、よくわかりません。何かアイデアはありますか?よろしくお願いします!