Назад | Перейти на главную страницу

Использование sed для преобразования шестнадцатеричных символов в файле дампа postgresql

Я работаю над перемещением нескольких баз данных с сервера Postgresql 8.3 на сервер Postgresql 8.4. Пока все работало нормально, но одна база доставила мне некоторые проблемы. База данных указана как кодированная в кодировке Unicode на сервере 8.3, но каким-то образом клиентской программе удалось внедрить в нее некорректные данные Unicode.

Когда я делаю нормальный дамп и восстанавливаю, используя собственный формат postgres, новый сервер не принимает его, жалуясь на ошибки Unicode.

Я планирую сделать дамп базы данных в виде простого текста, а затем использовать sed, чтобы ничего не заменить недопустимые символы (они не нужны). Но как заставить sed работать с шестнадцатеричными / двоичными значениями в файле?

Согласно ответу Питера, использование iconv - это типичное решение, которое большинство людей используют для очистки плохих данных. Если вы хотите заранее проанализировать данные (и, возможно, очистить их в исходной базе данных), вы можете использовать следующие https://github.com/xzilla/utf8checker найти проблемное место.

Типичное решение - использовать iconv -c.

Согласно двоичная замена sed в stackoverflow, ваш лучший шанс пройти через hexdump:

hexdump input | sed -e "..." | xxd -r -p output

Это приведет к удалению всех символов, находящихся вне диапазона 0x32 (пробел) в 0x7e (тильда):

someprog | LANG=C sed 's/[\x00-\x31\x7f-\xff]//g'

Вы можете использовать другие диапазоны символов, чтобы быть более избирательными.

Коллега подсказал мне в пользу Perl:

cat databasedump.sql | perl -pi -e 's / \ xc3 \ xa9 // g;' > fixeddatabasedump.sql

Хорошо, значит, это не sed, но, по крайней мере, синтаксис более или менее такой же.

tr -d '[:xdigit:]' < old_database > new_database также может работать.
tr -d удаляет только '[:xdigit:]' шестнадцатеричные символы