Bash Script - AWK, SED Комбинированный - PullRequest
0 голосов
/ 29 января 2019

У меня есть .sql файлы, содержащие запрос, как показано ниже:

begin;
CREATE TABLE public_local.account (
id bigint,
title text,
phone_prefix_list_id bigint,
company_account_id bigint,
created_at timestamp,
updated_at timestamp
);
COMMIT;

begin;
CREATE TABLE public_local.phones (
id integer,
customer_id integer,
company_id integer,
balance_cents bigint,
created_at timestamp,
updated_at timestamp
);
COMMIT;

Я намерен изменить только часть CREATE, чтобы она выглядела следующим образом:

begin;
INSERT INTO public_global.account SELECT * FROM public.dblink('mercury_local','SELECT * FROM account') as account(
id bigint,
title text,
phone_prefix_list_id bigint,
company_account_id bigint,
created_at timestamp,
updated_at timestamp
);
COMMIT;

begin;
INSERT INTO public_global.phones SELECT * FROM public.dblink('mercury_local','SELECT * FROM phones') as phones(
id integer,
customer_id integer,
company_id integer,
balance_cents bigint,
created_at timestamp,
updated_at timestamp
);
COMMIT;

Как мне изменить строку CREATE TABLE на INSERT INTO, используя AWK и SED внутри скрипта bash?

Мне удалось создать строки INSERT INTO, но я все еще могу 'не могу понять, как заменить CREATE TABLE строки

Примечание: я пытался найти тот же вопрос или аналогичный, но все еще не могу найти ту же ситуацию, что и я.

Ответы [ 2 ]

0 голосов
/ 29 января 2019

В простом awk вы можете просто найти свою строку и затем присвоить ей новое значение.

awk '/^CREATE TABLE/{$0="INSERT INTO bla_bla_bla SELECT * FROM bla.bla(\x27bla_bla\x27,\x27SELECT * FROM bla_bla\x27) as bla("} 1'  Input_file

Я изменил фактические значения с помощью bla_bla, вы можете поместить в него свои фактические значения.Вы должны написать \027 вместо ' для фактических значений.

0 голосов
/ 29 января 2019

Попробуйте, пожалуйста:

sed '/CREATE TABLE public_local/s/CREATE TABLE public_local.\([a-zA-Z]*\)/INSERT INTO public_global.\1 SELECT * FROM public.dblink(\x27mercury_local\x27,\x27SELECT * FROM \1\x27) as \1/' file.sql  

Таким образом, чтобы раскрыть переменную, нужно использовать двойные кавычки " и поместить переменную как ${variable_name}, я попробовал приведенный ниже скрипт, и он работал:

#!/usr/bin/bash

country="global"

sed "/CREATE TABLE public_local/s/CREATE TABLE public_local\.\([a-zA-Z_]*\)/INSERT INTO public_${country}.\1 SELECT * FROM public.dblink(\x27mercury_${country}\x27,\x27SELECT * FROM \1\x27) as \1/" file.sql
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...