Bash脚本-AWK,SED组合

Bash脚本-AWK,SED组合,awk,sed,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,

我有
.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;
我打算只更改
创建
部分,使其如下所示:

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脚本中使用
AWK
SED
CREATE TABLE
行更改为
INSERT-INTO

我已经成功地在行中创建了
插入,但是我仍然不知道如何替换
创建表

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

请尝试以下操作:

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\u 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

谢谢你的回答,但是sed可以使用shell变量吗?因为我需要在行中添加一些变量also@buzzing_bee是的,使用双引号而不是单引号,将
${varName}
放在里面,并使用escape处理一些扩展。hi@Tiw,在我再次尝试使用您的sed之后,这是唯一的更改(替换)第一个\1是
\uuu插入到public\u global中。\1
,之后的
\1
没有被替换。括号内和
后面的那一个是
as
我使用的是sed(GNU sed)4.4和Ubuntu 18.04 LTS。我直接从这里复制了sed命令,只是在regex
\([a-zA-Z]*\)
注意正方形末尾的下划线bracket@buzzing_bee这很奇怪…它应该能用在我身上。你是在其他东西里面使用它吗,比如某种脚本?