Caso de borda do console Postgres não obedece às regras de regexp POSIX?

Olá, estou tentando executar alguns comandos regexp_replace no console pg para converter links na minha instância de teste do Discourse que foi migrada de um enorme fórum Drupal 7. Em quase 2 milhões de posts, há um monte de links em formato Textile que precisam ser convertidos para Markdown. É isso que estou tentando usar:

Funciona corretamente no testador acima, bem como no meu editor de texto; ele transforma isto:

  • Cqwertyuioy - Lasgfdf Sddgfdds (Dsajjsa Vsjsjk Osaskgkk Spfs) \"link\":http://www.youtube.com/watch?v=aQjkOmzQ8RT

Nisto:

  • Cqwertyuioy - Lasgfdf Sddgfdds (Dsajjsa Vsjsjk Osaskgkk Spfs) [link](http://www.youtube.com/watch?v=aQjkOmzQ8RT)

Mas no console pg do Discourse eu executo isto:

  • update posts set raw = regexp_replace(raw, '\"(.*?)\"\\:(http\\S+?(?=\\W+(?:$|\\s))|http\\S+)', E'[\\\\1](\\\\2)', 'g');

E acabo com isto:

  • Cqwertyuioy - Lasgfdf Sddgfdds (Dsajjsa Vsjsjk Osaskgkk Spfs) [link](http:)//www.youtube.com/watch?v=aQjkOmzQ8RT

(Desculpe pela anonimização.) Então a parte importante é:

  • Correto: [link](http://www.youtube.com/watch?v=aQjkOmzQ8RT)
  • Errado: [link](http:)//www.youtube.com/watch?v=aQjkOmzQ8RT

Imagino que tenha algo a ver com a estranheza do caractere de escape no caso de consultas SQL e/ou as funções especiais de [] e () versus literais, mas não consigo descobrir. Alguma ideia? Obrigado!

Não conheço o PostgreSQL, mas funciona usando o console do Rails:

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

Ah, muito obrigado por me mostrar como usar o console do Rails para isso. Parece que é muitas ordens de magnitude mais lento do que executar um comando SQL bruto (o que faz sentido), então reportarei se/quando o comando terminar.

Bem, acabei abortando o processo do Rails e voltei para o console pg. Também recebi uma sugestão para uma regexp muito mais simples (e espero que mais fácil de depurar) que também funciona muito bem fora do console pg:
" (.*?) ":(\\S*)\\b

Mas definitivamente há algo não padrão na consulta SQL, isso não fez nada com os links:
update posts set raw = regexp_replace(raw, '\"(.*?)\":(\\S*)\\b', E'[\\\\1](\\\\2)', 'g');
Nem isso:
update posts set raw = regexp_replace(raw, '\"(.*?)\"\\:(\\S*)\\b', E'[\\\\1](\\\\2)', 'g');

Então, o que está acontecendo?