删除Postgres转储中的换行符

时间:2011-10-10 10:46:12

标签: postgresql import sed export

我正在尝试格式化postgres转储(pg_dump)以便能够使用JDBC连接导入它。 pg_dump将包含换行符的文本字段导出为带有换行符的文本字段,因此当我稍后尝试使用JDBC导入时,我到达行尾并且语句失败。

我想要做的是获取转储,通过sed传递并转义所有换行符,以便每行最终得到一个INSERT语句。问题是我不能删除所有换行符,但我可以删除不匹配);\nINSERT INTO的所有换行符。有没有一种简单的方法可以做到这一点?

更新: 样本看起来像这样:

INSERT INTO sometable (123, And here goes some text
with
newlines
in
it', 'some more fields');

我正在寻找的结果是这样的:

INSERT INTO sometable (123, And here goes some text\nwith\nnewlines\nin\nit', 'some more fields');

这样每个INSERT语句都在一行上,字符串的换行符被转义。

2 个答案:

答案 0 :(得分:2)

不是sed解决方案,但可能会有以下工作吗?

cat test_dump.txt | perl -pe "s/[^(\);INSERT INTO)]\n/\\$1\\n/"

答案 1 :(得分:0)

您可以在 vim 中执行此操作。

vim my_dump.sql

:%s/\();\)\@<!\n\(INSERT\)\@!//c

%..对所有行做 s ..替代
\ n ..换行(Unix风格;你知道,Windows有\r\n和Apple \r用于换行吗?)

国旗:
c ..确认每次替换(首先进行测试)

负面前瞻和外观的信息 :help \ @!
:help \ @&lt;!


sed 通常在上运行,它需要不遗余力地替换换行符。
谷歌“sed multi-line replace”,你会发现像this这样的东西。