首页 > 解决方案 > Bash 脚本 - AWK、SED 组合

问题描述

我有.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;

如何使用bash 脚本和在 bash 脚本中将CREATE TABLE行更改为行?INSERT INTOAWKSED

我已成功创建INSERT INTO线条,但我仍然无法弄清楚如何替换CREATE TABLE线条

注意:我尝试搜索相同或类似的问题,但仍然找不到与我相同的情况。

标签: awksed

解决方案


请试试这个:

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

推荐阅读