如何从文件中删除前 X 行直到第一次出现特定字符串?

如何从文件中删除前 X 行直到第一次出现特定字符串?

我有许多这样的 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打印到终端。

来源:awk:打印匹配到文件末尾后的行

相关内容