Postgres 콘솔의 엣지 케이스가 POSIX 정규식 규칙을 따르지 않나요?

안녕하세요, 테스트베드용 Discourse 인스턴스에서 링크를 변환하기 위해 pg 콘솔에서 몇 가지 regexp_replace 명령을 실행하려고 하고 있습니다. 해당 인스턴스는 매우 큰 Drupal 7 포럼에서 마이그레이션되었습니다. 약 200만 개의 게시물 중 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)

하지만 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 쿼리의 경우 이스케이프 문자 처리 문제와/또는 [] 및 ()의 특수 기능과 리터럴 간의 차이와 관련이 있다고 짐작하고 있지만, 원인을 파악하지 못했습니다. 혹시 아이디어가 있으신가요? 감사합니다!

PostgreSQL은 잘 모르지만, rails 콘솔에서는 이렇게 작동합니다:

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');

도대체 무슨 일이 일어나고 있는 걸까요?