Estoy usando el siguiente código de un script bash para reemplazar las comillas simples de mi columna de título en una base de datos de Postgres con espacios.
psql -U postgres -d my_database -c "UPDATE my_table SET title = regexp_replace(title, '''', ' ', 'g')"
Mi problema es que tenía la intención de eliminar las comillas simples alrededor de las cadenas, por ejemplo, así:
this is example 'number one' ok
se convierte
this is example number one ok
Esto funciona como esperaba. Sin embargo, también elimina las comillas simples dentro de las palabras, por lo que:
can't
se convierte
can t
¿Cómo puedo especificar que solo quiero reemplazar las comillas simples alrededor de las cadenas?
Respuesta1
No creo que haya una buena manera de hacerlo con un solo reemplazo. Pero si cuatro reemplazos están bien, proceda de la siguiente manera:
Reemplazar
\A'
por(es decir, reemplazar
'
al principio de la cadena).Reemplazar
'\Z
por(es decir, reemplazar
'
al final de la cadena).Reemplazar globalmente
([^[:alnum:]])'
por\1
(es decir, reemplazar cada secuencia de un carácter no alfanumérico y'
por el carácter no alfanumérico y).
Reemplazar globalmente
'([^[:alnum:]])
por\1
(es decir, reemplazar cada secuencia de'
y un carácter no alfanumérico pory el carácter no alfanumérico).
El efecto neto es reemplazar todos '
, excepto aquellos que están precedidosyseguido de un carácter alfanumérico.
Descargo de responsabilidad: no tengo idea sobre PostgreSQL; usted mismo debe traducirlo a la sintaxis de PostgreSQL.
Respuesta2
Utilice una expresión regular más inteligente: si reemplaza " '
" y " '
" ( SPACE APOSTROPHEy APOSTROPHE SPACE), se perderán los apóstrofes dentro de las palabras.
Respuesta3
Si desea evitar los apóstrofes en las palabras, busque apóstrofes, que no tienen letra a la izquierda ni a la derecha. Una posible expresión regular para buscar tales apóstrofes podría ser
([A-Za-z])\'([^A-Za-z])|([^A-Za-z])\'([A-Za-z])|([^A-Za-z])\'([^A-Za-z])
o más corto
\'([^A-Za-z])|([^A-Za-z])\'
o incluso más corto
\'([^\w])|([^\w])\'
Supongo que regexp_replace sería
regexp_replace(title, '\'([^\w])|([^\w])\'', '\1', 'g')
No estoy familiarizado con psql, por lo que la sinatx correcta podría ser
regexp_replace(title, '''([^\w])|([^\w])''', '\1', 'g')