Заменить строку перед шаблоном с помощью sed или awk

У меня есть следующие данные в файле sacro.sql :

{ TABLE "informix".sacro_log row size = 64 number of columns = 3 index size = 0 }

{ unload file name = sacro00518.unl number of rows = 0 }

create table "informix".sacro_log
(
log_id serial not null constraint "informix".nnc_sac_log00,
log_type integer,
log_data text
);

revoke all on "informix".sacro_log from "public" as "informix";

Я хочу заменить вторую строку над "create table" informix ".sacro_log" на test

Пример вывода Я хочу:

{ TABLE "informix".sacro_log row size = 64 number of columns = 3 index size = 0 }

test

create table "informix".sacro_log
(
log_id serial not null constraint "informix".nnc_sac_log00,
log_type integer,
log_data text
);

revoke all on "informix".sacro_log from "public" as "informix";
-1
30.04.2017, 21:51
2 ответа
sed '/create table "informix"/i\
test
' data.in >data.out

Будет создан data.out со следующим содержимым:

{ TABLE "informix".sacro_log row size = 64 number of columns = 3 index size = 0 }

{ unload file name = sacro00518.unl number of rows = 0 }

test
create table "informix".sacro_log
(
log_id serial not null constraint "informix".nnc_sac_log00,
log_type integer,
log_data text
);

Команда i ("insert") в sed вставит указанный текст перед соответствующим шаблоном. Вставляемый текст должен следовать за символом новой строки (GNU sed также принимает sed '/pattern/i text').

1
28.01.2020, 05:10

Не знаю, если вы все еще ждете ответа, это может помочь.

awk -v newline=test -v trigger='create table "informix"' '
   {a[NR]=$0}
   NR>2 { if (index($0,trigger)>0) { a[NR-2]=newline; }}
   END { 
          for (i=1;i<=NR;i++) { print a[i] }
       }
   ' sacro.sql
0
28.01.2020, 05:10

Теги

Похожие вопросы