我有一个 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)
我愿意使用perl
or 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