Postgres-Konsole Randfall ignoriert POSIX-Regexp-Regeln?

Hallo, ich versuche, einige regexp_replace-Befehle in der pg-Konsole auszuführen, um Links in meiner Testinstanz von Discourse zu konvertieren, die von einem riesigen Drupal 7 Forum migriert wurden. In fast 2 Millionen Beiträgen gibt es eine Reihe von Links im Textile-Format, die in Markdown konvertiert werden müssen. Dies ist, was ich zu verwenden versuche:

Es funktioniert korrekt im obigen Tester sowie in meinem Texteditor; es wandelt dies um:

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

in dies:

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

Aber in der Discourse pg-Konsole führe ich dies aus:

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

Und ich lande mit diesem:

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

(Entschuldigung für die Anonymisierung.) Der wichtige Teil ist also:

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

Ich stelle mir vor, dass es etwas mit der Seltsamkeit des Escape-Zeichens im Falle von SQL-Abfragen und/oder den Sonderfunktionen von [] und () im Vergleich zu Literalen zu tun hat, aber ich kann es nicht herausfinden. Irgendwelche Ideen? Danke!

Ich kenne PostgreSQL nicht, aber es funktioniert mit der Rails-Konsole:

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

Ah, vielen Dank, dass Sie mir gezeigt haben, wie ich die Rails-Konsole dafür verwenden kann. Es scheint, dass sie um viele Größenordnungen langsamer ist als die Ausführung eines rohen SQL-Befehls (was Sinn ergibt). Ich werde mich also melden, wenn/sobald der Befehl abgeschlossen ist.

Nun, ich habe den Rails-Prozess abgebrochen und bin zur pg-Konsole zurückgekehrt. Ich erhielt auch einen Vorschlag für einen viel einfacheren (und hoffentlich leichter zu debuggenden) regulären Ausdruck, der auch außerhalb der pg-Konsole sehr gut funktioniert:
"(.?*)":(\S*)\b

Aber es gibt definitiv etwas Nicht-Standardmäßiges an der SQL-Abfrage, diese hat überhaupt nichts mit den Links gemacht:
update posts set raw = regexp_replace(raw, '\"(.*?)\":(\\S*)\\b', E'[\\\\1](\\\\2)', 'g');
Auch diese nicht:
update posts set raw = regexp_replace(raw, '\"(.*?)\"\\:(\\S*)\\b', E'[\\\\1](\\\\2)', 'g');

Also, was ist los?