使用字符串列表来替换 sql 参数,为每个替换打印整个文件

使用字符串列表来替换 sql 参数,为每个替换打印整个文件

我有一个 txt 文件,其中单列中包含字符串值:

File.txt

A

B
.
.
.
Z

我有一个sql带有名为 的变量的脚本'parameter'

script.sql

declare @var varchar(255)
set @var = 'parameter'
select * from table_name where column = @var
go

我想逐行读取文件并使用每一行替换 sql 中的参数,将所有sql语句打印到文件中(并最终运行该 sql)

我愿意使用perlor python,但如果有一个简单的 shell 解决方案将不胜感激。

例如:cat file.txt |sed "s/parameter/$0/" script.sql

例如A和 的预期输出B

新文件

declare @var varchar(255)
set @var = 'A'
select * from table_name where column = @var
go
declare @var varchar(255)
set @var = 'B'
select * from table_name where column = @var
go

答案1

bash 方式有每次调用 sed 的陷阱(性能损失):

while read -r line;do
  sed -r "s/parameter/$line" script.sql >>newfile.sql
done <file.txt

另一种 bash 方式:

old="$(<script.sql)"
while read -r ln;do
echo "${old/parameter/$ln}" >>newfile.sql
done <file.txt

awk 的方式:

awk 'NR==FNR{a[FNR]=$0;last=FNR;next}{for (i=1;i<=last;i++) \
print (a[i] ~ /^set @var/)?gensub(/parameter/,$0,"g",a[i]):a[i] >>"new.sql"}' script.sql file.txt

awk 在线测试在这里(按代码上方的执行按钮)

答案2

read -d '' -r SQL < script.sql
while IFS= read -r par; do printf '%s\n' "${SQL/\'parameter\'/\'$par\'}"; done < File.txt

相关内容