Пограничный случай в консоли Postgres не следует правилам POSIX regexp?

Привет! Я пытаюсь выполнить несколько команд regexp_replace в консоли PostgreSQL, чтобы преобразовать ссылки в моем тестовом экземпляре Discourse, который был перенесен с огромного форума Drupal 7. Почти в 2 миллионах сообщений есть ссылки в формате Textile, которые нужно конвертировать в Markdown. Вот что я пытаюсь использовать:

Это работает корректно как в указанном тестере, так и в моем текстовом редакторе; оно превращает:

  • 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)

Но в консоли PostgreSQL Discourse я запускаю это:

  • 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-запросах и/или со специальными функциями [] и () по сравнению с буквальными значениями, но я не могу разобраться. Есть какие-то идеи? Спасибо!

Я не знаю PostgreSQL, но это работает через rails console:

Post.find_each do |p|
  p.raw.gsub!(/"(.*?)"\:(http\S+?(?=\W+(?:$|\s))|http\S+)/, '[\\1](\\2)')
  p.save
end

Ах, большое спасибо, что показали, как использовать консоль Rails для этого. Похоже, это на несколько порядков медленнее, чем выполнение сырого SQL-запроса (что логично), поэтому я сообщу, когда/если команда завершится.

Что ж, в итоге я прервал процесс Rails и вернулся к консоли pg. Мне также предложили значительно более простое (и, надеюсь, более простое для отладки) регулярное выражение, которое также отлично работает вне консоли pg:
"(.*?)":(\S*)\b

Но в SQL-запросе определённо есть что-то нестандартное: это вообще никак не повлияло на ссылки:
update posts set raw = regexp_replace(raw, '"(.*?)":(\S*)\b', E'[\\1](\\2)', 'g');
То же самое и с этим:
update posts set raw = regexp_replace(raw, '"(.*?)"\:(\S*)\b', E'[\\1](\\2)', 'g');

Так в чём же дело?