¿El caso límite de la consola de Postgres no obedece las reglas de expresiones regulares POSIX?

Hola, estoy intentando ejecutar algunos comandos regexp_replace en la consola de PostgreSQL para convertir enlaces en mi instancia de prueba de Discourse que fue migrada desde un enorme foro de Drupal 7. En casi 2 millones de publicaciones, hay una gran cantidad de enlaces en formato Textile que deben convertirse a Markdown. Esto es lo que estoy intentando usar:

Funciona correctamente en el probador anterior, así como en mi editor de texto; convierte esto:

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

En esto:

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

Pero en la consola de PostgreSQL de Discourse ejecuto esto:

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

Y obtengo esto:

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

(Disculpas por la anonimización.) Así que la parte importante es:

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

Imagino que tiene algo que ver con la rareza del carácter de escape en el caso de las consultas SQL y/o las funciones especiales de [] y () frente a los literales, pero no puedo descifrarlo. ¿Alguna idea? ¡Gracias!

No sé PostgreSQL, pero funciona usando la consola de Rails:

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

Ahh, muchas gracias por mostrarme cómo usar la consola de Rails para eso. Parece que es muchos órdenes de magnitud más lento que ejecutar un comando SQL en bruto (lo que tiene sentido), así que informaré si/cuando el comando termine.

Bueno, terminé abortando el proceso de Rails y volví a la consola de pg. También recibí una sugerencia para una expresión regular mucho más simple (y que espero sea más fácil de depurar) que también funciona muy bien fuera de la consola de pg:
"([^"]*)":(\S*)\b

Pero definitivamente hay algo no estándar en la consulta SQL, esto no hizo nada a los enlaces:
update posts set raw = regexp_replace(raw, '"([^"]*)":(\S*)\b', E'[\1](\2)', 'g');
Tampoco esto:
update posts set raw = regexp_replace(raw, '"([^"]*)"\:(\S*)\b', E'[\1](\2)', 'g');

Entonces, ¿qué pasa?