Postgres 데이터베이스의 헤더 열에 있는 작은따옴표를 공백으로 바꾸기 위해 bash 스크립트에서 다음 코드를 사용하고 있습니다.
psql -U postgres -d my_database -c "UPDATE my_table SET title = regexp_replace(title, '''', ' ', 'g')"
내 문제는 다음과 같이 문자열 주위의 작은따옴표를 제거하려고 한다는 것입니다.
this is example 'number one' ok
~이 되다
this is example number one ok
이것이 바로 제가 바랐던 것입니다. 그러나 단어에서 작은따옴표도 제거하므로 다음과 같습니다.
can't
~이 되다
can t
문자열 주위의 작은따옴표만 바꾸도록 지정하려면 어떻게 해야 합니까?
답변1
단 한 번의 대체만으로 이를 수행할 수 있는 좋은 방법은 없다고 생각합니다. 하지만 4번의 교체로 충분하다면 다음 단계를 따르세요.
\A'
다음으로 바꾸십시오(즉,
'
문자열의 시작 부분을 바꾸십시오).'\Z
다음으로 대체(즉,
'
문자열 끝에서 대체).전역적 으로 다음
([^[:alnum:]])'
으로 대체합니다\1
(즉, 영숫자가 아닌 문자 sum 의 모든 시퀀스를'
영숫자가 아닌 문자 sum 으로 대체).
'([^[:alnum:]])
전역적으로 다음 으로 대체\1
(즉,'
영숫자가 아닌 문자의 모든 시퀀스를영숫자가 아닌 문자로 대체)
순 효과는 '
이전 항목을 제외한 모든 항목을 대체하는 것입니다.그리고그 뒤에는 영숫자가 옵니다.
면책 조항: 저는 PostgreSQL에 대해 아무것도 모릅니다. 이를 PostgreSQL 구문으로 직접 변환해야 합니다.
답변2
'
더 똑똑한 정규식 사용: " " 및 " '
"( SPACE APOSTROPHE및 ) 를 바꾸면 APOSTROPHE SPACE단어 내의 아포스트로피가 누락됩니다.
답변3
단어에 아포스트로피를 사용하지 않으려면 양쪽에 문자가 없는 아포스트로피를 찾으세요. 그러한 아포스트로피를 찾는 정규 표현식은 다음과 같습니다.
([A-Za-z])\'([^A-Za-z])|([^A-Za-z])\'([A-Za-z])|([^A-Za-z])\'([^A-Za-z])
또는 더 짧음
\'([^A-Za-z])|([^A-Za-z])\'
더 짧다
\'([^\w])|([^\w])\'
나는 regexp_replace가 될 것 같아요
regexp_replace(title, '\'([^\w])|([^\w])\'', '\1', 'g')
나는 psql에 익숙하지 않으므로 올바른 synatx는 다음과 같습니다.
regexp_replace(title, '''([^\w])|([^\w])''', '\1', 'g')