У меня есть PostgreSQL дамп базы данных pg_dump версии 9.5.2, который содержит DDL, а также INSERT INTO
операторы для каждой таблицы в данной базе данных. Дамп выглядит так:
SET statement_timeout = 0;
SET lock_timeout = 0;
SET client_encoding = 'UTF8';
CREATE TABLE unimportant_table (
id integer NOT NULL,
col1 character varying
);
CREATE TABLE important_table (
id integer NOT NULL,
col2 character varying NOT NULL,
unimportant_col character varying NOT NULL
);
INSERT INTO unimportant_table VALUES (123456, 'some data split into
- multiple
- lines
just for fun');
INSERT INTO important_table VALUES (987654321, 'some important data', 'another crap split into
- lines');
...
-- thousands of inserts into both tables
Файл дампа действительно большой, и он создан другой компанией, поэтому я не могу повлиять на процесс экспорта. Мне нужно создать 2 файла из этого дампа:
- Все операторы DDL (все операторы, которые не начинаются с
INSERT INTO
) - Все операторы
INSERT INTO important_table
(я хочу только восстановить некоторые таблицы из дампа)
Если все операторы будут в одной строке без символа новой строки в данных, будет очень легко создать скрипт 2 SQL с помощью grep, например:
grep -v '^INSERT INTO .*;$' my_dump.sql > ddl.sql
grep -o '^INSERT INTO important_table .*;$' my_dump.sql > important_table.sql
# Create empty structures
psql < ddl.sql
# Import only one table for now
psql < important_table.sql
Сначала я думал об использовании grep
, но я не нашел, как обрабатывать несколько строк одновременно, затем я попробовал sed
, но он возвращает только однострочные вставки. Я также использовал https://regex101.com/, чтобы найти правильное регулярное выражение, но я не знаю, как объединить его с grep
или sed
:
^(?!(INSERT INTO)).*$ -- for ddl
^INSERT INTO important_table(\s|[[:alnum:]])*;$ -- for inserts
Я нашел аналогичный вопрос pcregrep multiline SQL match , но ответа нет. Кроме того, я не возражаю, если решение будет работать с grep
, sed
или с чем угодно, что вы предлагаете, но оно должно работать на Ubuntu 18.04.4 TLS.