У меня есть много дампов PostgreSQL, регистрирует такой это и потому что я импортирую эти файлы автоматически в другой сервер базы данных (H2) и SET
команда не совместима с этой базой данных, я должен удалить все строки до самого первого INSERT
команда.
Как я могу сделать это в сценарии оболочки?
--
-- PostgreSQL database dump
--
-- Dumped from database version 9.6.8
-- Dumped by pg_dump version 9.6.8
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET client_min_messages = warning;
SET row_security = off;
--
-- Data for Name: workgroups; Type: TABLE DATA; Schema: public; Owner: postgres
--
INSERT INTO public.workgroups.....
Спасибо.
Можно сделать это использование sed
:
sed -n '/^INSERT/,$p' file.sql
INSERT ...
в конец. /^INSERT/
,
$
p
Изменить файл вместо того, чтобы просмотреть его:
sed -n -i.bk '/^INSERT/,$p' file.sql
.bk
суффикс.Выполнять его на всех файлах:
sed -n -i.bk '/^INSERT/,$p' ~/path/to/sql_dir/*.sql
Например:
Foo
Bar
FooBar
INSERT Foo
Fantastic
Стал бы:
INSERT Foo
Fantastic
Можно сделать это использование awk
:
awk '/^INSERT/{x=1}x==1' <in >out # including the INSERT line
awk 'x==1{print}/^INSERT/{x=1}' <in >out # including the INSERT line
Это читает файл in
линию за линией и наборы x=1
если начало строки со “ВСТАВКИ” найдено. Если x
1, это печатает в настоящее время обрабатываемую строку – в первом выражении {print}
был опущен, поскольку это - действие по умолчанию. Вывод сохраняется в файле out
, не учесть >out
распечатать к терминалу вместо этого.
Источник: awk: строки печати после соответствия к концу файла