使用sed在postgresql转储文件中转换hex字符

我正在将几个数据库从Postgresql 8.3服务器移动到Postgresql 8.4服务器。 到目前为止工作得很好,但是一个基地给了我一些麻烦。 该数据库在8.3服务器中被列为unicode编码,但是不知何故,客户端程序已经设法向其中注入一些无效的unicode数据。

当我使用postgres的自定义格式进行正常转储和恢复时,新服务器将不会接受它,抱怨unicode错误。

我的计划是做一个数据库的纯文本转储,然后使用sedreplace无效字符(他们不需要)。 但是,如何让sed在文件中的hex/二进制值工作?

一个典型的解决scheme是使用iconv -c

根据彼得的回答,使用iconv是大多数人用来清理不良数据的典型解决scheme。 如果您想提前对数据进行一些分析(也许可以在原始数据库中进行清理),则可以使用以下https://github.com/xzilla/utf8checker查找故障点。

根据stackoverflow上的二进制sedreplace ,你最好的select是通过hexdump移动:

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

这将0x32 (空格)范围之外的所有字符到0x7e (代字号):

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

您可以使用其他字符范围更具select性。

一位同事向我介绍了Perl的方向:

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

好吧,所以它不是sed,但至less语法是差不多的。

tr -d '[:xdigit:]' < old_database > new_database也可能工作。
tr -d只删除'[:xdigit:]'hex字符