Удаление новых строк в дампе Postgres - PullRequest
3 голосов
/ 10 октября 2011

Я пытаюсь отформатировать дамп 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 ]

2 голосов
/ 10 октября 2011

Не решение sed, но может ли работать следующее?

cat test_dump.txt | perl -pe "s/[^(\);INSERT INTO)]\n/\\$1\\n/"
0 голосов
/ 10 октября 2011

Вы можете сделать это в vim .

vim my_dump.sql

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

% .. сделать для всех строк
s .. заменить
\ n .. newline (стиль Unix; вы знаете, что в Windows есть \r\n и Apple \r для разрывов строк?)

flags:
c .. Подтверждение каждой замены (для первого тестирования)

infoна негативном взгляде вперед и назад
: help \ @!
: help \ @

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...