Estou usando o código abaixo de um script bash para substituir aspas simples da minha coluna de título em um banco de dados postgres por espaços.
psql -U postgres -d my_database -c "UPDATE my_table SET title = regexp_replace(title, '''', ' ', 'g')"
Meu problema é que eu pretendia remover aspas simples em torno de strings, por exemplo, assim:
this is example 'number one' ok
torna-se
this is example number one ok
Isso funciona como eu esperava. No entanto, também remove as aspas simples das palavras, então:
can't
torna-se
can t
Como posso especificar que desejo apenas substituir as aspas simples nas strings.
Responder1
Não acho que haja uma maneira legal de fazer isso com apenas uma substituição. Mas se quatro substituições estiverem bem, proceda da seguinte forma:
Substitua
\A'
por(ou seja, substitua
'
no início da string).Substitua
'\Z
por(ou seja, substitua
'
no final da string).Substitua globalmente
([^[:alnum:]])'
por\1
(ou seja, substitua todas as sequências de um caractere não alfanumérico e'
pelo caractere não alfanumérico e).
Substitua globalmente
'([^[:alnum:]])
por\1
(ou seja, substitua cada sequência de'
e um caractere não alfanumérico pore o caractere não alfanumérico).
O efeito líquido é substituir todos '
, exceto aqueles que são precedidoseseguido por um caractere alfanumérico.
Isenção de responsabilidade: não tenho ideia sobre o PostgreSQL; você mesmo deve traduzi-lo para a sintaxe do PostgreSQL.
Responder2
Use um regex mais inteligente: se você substituir " '
" e " '
" ( SPACE APOSTROPHEe APOSTROPHE SPACE), perderá os apóstrofos intra-palavras.
Responder3
Se você quiser evitar apóstrofos nas palavras, procure apóstrofos, que não possuem letra esquerda ou direita. Uma possível expressão regular para procurar tais apóstrofos poderia ser
([A-Za-z])\'([^A-Za-z])|([^A-Za-z])\'([A-Za-z])|([^A-Za-z])\'([^A-Za-z])
ou mais curto
\'([^A-Za-z])|([^A-Za-z])\'
ou até mais curto
\'([^\w])|([^\w])\'
Eu acho que regexp_replace seria
regexp_replace(title, '\'([^\w])|([^\w])\'', '\1', 'g')
Não estou familiarizado com o psql, então a sintaxe correta pode ser
regexp_replace(title, '''([^\w])|([^\w])''', '\1', 'g')