2011-10-10 26 views
3

我想格式化一個postgres轉儲(pg_dump)以便能夠使用JDBC連接導入它。 pg_dump將包含換行符的文本字段導出爲帶有換行符的文本,因此當我稍後嘗試使用JDBC導入時,我會到達行尾並且語句失敗。在Postgres轉儲中刪除換行

我想要做的就是轉儲,通過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語句在一條線,字符串的換行符被轉義。

+1

你的問題描述很混亂。你可以顯示樣本'轉儲',加上你需要作爲最終輸出(只是前或後2行)。祝你好運。 – shellter

+0

剛剛添加了一個示例以顯示我在找什麼。 – cdecker

+0

你最好改變你的SQL解析器,以便能夠處理跨越多行的字符文字。 –

回答

1

不是sed解決方案,但可能下面的工作?

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

可以在VIM做到這一點。

vim my_dump.sql 

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

%..所有行做
秒。替代
\ n ..換行符(Unix的風格,大家都知道,Windows有\r\n和蘋果\r換行?)

標誌:
ç..確認每個替代(用於測試第一)負前瞻

信息和回顧後
:幫助\ @!
:help \ @ <!


sed的通常在,它需要去讓開,更換換行操作。
Google對於「sed多行替換」,您會發現像this之類的內容。