我有许多这样的 PostgreSQL 转储文件,因为我将这些文件自动导入到另一个数据库服务器(H2),并且SET
命令与该数据库不兼容,所以我需要删除直到第一个INSERT
命令的所有行。
我怎样才能在 shell 脚本中做到这一点?
--
-- 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.....
谢谢。
答案1
您可以使用以下方法进行操作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
答案2
您可以使用以下方法执行此操作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
是否找到以“INSERT”开头的行。如果x
为 1,则打印当前处理的行 – 省略第一个表达式,{print}
因为它是默认操作。输出保存在文件中out
,省略则>out
打印到终端。