Я использую приведенный ниже код из скрипта bash для замены одинарных кавычек в столбце title в базе данных postgres на пробелы.
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
Я не думаю, что есть какой-то хороший способ сделать это с помощью одной замены. Но если четырех замен достаточно, действуйте следующим образом:
Заменить
\A'
на(то есть заменить
'
в начале строки).Заменить
'\Z
на(то есть заменить
'
в конце строки).Глобально заменить
([^[:alnum:]])'
на\1
(то есть заменить каждую последовательность не алфавитно-цифровых символов и'
на не алфавитно-цифровой символ и).
Глобально заменить
'([^[: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, поэтому правильный синтаксис может быть таким:
regexp_replace(title, '''([^\w])|([^\w])''', '\1', 'g')